9

仮想メンバー関数とは対照的に、各レベルのクラス派生で実装された関数を登録して、後で基本クラスから呼び出すことができるソリューションが必要です。(最も派生した実装だけではありません)

これを行うために、派生クラスのコンストラクターなどで、派生クラスが関数を基底クラスに登録するメカニズムを提供することを考えていました。

ただし、メンバー関数のポインター引数に問題があります。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))'
4

2 に答える 2

15

必要なのはエラーメッセージを打ち負かすことだけであれば、キャストはそれを行います:

class Derived : public Base
{
    Derived() {
        registerPrepFn( static_cast<PrepFn>(&Derived::derivedPrepFn) );
    };

    void derivedPrepFn( int n ) {};

}

Base* p(実際に Derived を指している場合) :(p->*registered)(0)

実際の例については、 http://ideone.com/BB9oyを参照してください。

于 2012-04-08T21:56:23.810 に答える
0

これは oop では許可されていません。動作の切り替えは、オブジェクトの作成時にオブジェクトのクラスをポリモーフィングすることによって実現されます。

オブジェクト作成後の動作の切り替えが必要な場合は、動的な動作を別のポリモーフィック クラスのセットにリファクタリングし、正しい動作を持つクラスのインスタンスへの「ポインター」を保持することができます。「装飾クラス」ソフトウェア パターンを Google で検索してください。

于 2012-04-08T21:54:19.613 に答える