std ::バインドを使用すると、クエリデータの前にデザインモードで良いオブザーバーパターンを達成できることを見出しました。
しかし、呼び出された関数のバインドは、マルチレベルポインターの継承を使用して継承を実装することがより困難に結合しました。
次のようにサンプル・コードは次のとおりです。
コンパイラ環境:VS2017
1つの#include " pch.h " 2の#include <iostreamの> 3の#include <ベクトル> 4の#include <機能> 5 クラスベース 6 { 7 公共: 8 の仮想 ボイド printMsg(){のstd :: COUT << " 基本クラス「 << はstd ::てendl; } 9 }。 10 11 クラスの派生:公共ベース 12 { 13 公共: 14 仮想 ボイド printMsg(){のstd :: coutの<<" 派生クラス" << はstd ::てendl; } 15 }。 16の 17 クラスTestClassを 18 { 19 公共: 20 ボイド PrintMsg(ベース** ppbase){(* ppbase) - > printMsg(); } 21 }。 22 23 のint main()の 24 { 25 のstd ::ベクトル<はstd ::関数< ボイド(ベース**)>> VEC1。 26 TestClassを* PTEST = 新しいTestClassを()。 27 ベース* PBASE = 新しいベース()。 28 ベース* pder =新しい新しい派生(); 29 ベース** =&ppbase PBASE; //はサブクラス増やす 30 vec1.push_back(STD ::バインド(&TestClassを:: PrintMsg、PTEST、ppbase))を、 31である * = ppbase PDER; // 割り当て 32 VEC1 [ 0 ](NULL); 33である 34である 戻り 0 ; 35 }
あなたがライン29と31を削除した場合、基本クラスを表示し、プラスその後、派生クラスを表示します。呼び出し時に、アドレスのポインタがすでに変更されたためです。