仮想メンバー関数とは対照的に、各レベルのクラス派生で実装された関数を登録して、後で基本クラスから呼び出すことができるソリューションが必要です。(最も派生した実装だけではありません)
これを行うために、派生クラスのコンストラクターなどで、派生クラスが関数を基底クラスに登録するメカニズムを提供することを考えていました。
ただし、メンバー関数のポインター引数に問題があります。Derived は Base から派生していると考えていたので、this
ポインタは自動的にキャストされるはずです。
これは私が試みていることの近くで行うことができますか、それとも静的メンバー関数、、void *
およびを使用する必要がありstatic_cast
ますか?
class Base
{
protected:
typedef void (Base::*PrepFn)( int n );
void registerPrepFn( PrepFn fn ) {};
}
class Derived : public Base
{
Derived() {
registerPrepFn( &Derived::derivedPrepFn );
};
void derivedPrepFn( int n ) {};
}
コンパイラ エラー:
error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are: 'void Base::registerPrepFn(void (Base::*)(int))'