2

純粋仮想メンバー関数 func() を持つ抽象クラス A があります。多数の派生クラスが存在し、それぞれが func() の異なる実装を持っています。

cout << "hello world";func() の各呼び出しで実行される追加のタスクを追加する必要があると想像してください。たとえば、派生クラスから独立しているとしましょう。タスクは func() の内容からも独立しているため、func() の前、後、または途中でも実行できますが、func() への各呼び出しが一度だけ実行されるという事実だけが重要です。

c++(11) はこれを行うスマートな方法を許可しますか?

私の頭に浮かぶ最善のことは、タスクが実装されている親クラスに pre-func() メソッドを記述し、派生クラスのすべての func() 実装の先頭に pre-func() への呼び出しをコピーすることです。クラス。もっと良いものはありますか?

4

2 に答える 2

4

非仮想インターフェイスのイディオムを使用できると思います

基本クラスは次のようになります。

class A{

public:
    void myFunc();

private:
    virtual void myVirtualFunc();
}

特に .cpp の次の内容:

void A::myFunc(){
    //stuff
    myVirtualFunc();
    //stuff
}

その後、各派生クラスは再実装myVirtualFunc()してその動作を変更できます。仮想はプライベートであるため、基本クラスで定義されたパブリックの非仮想以外の場所では呼び出されないことが保証されます (呼び出しごとに実行する必要があるコードが実行されることが保証されます)。派生クラスがそれを再実装するのを妨げません。派生クラスは、仮想関数の場所ではなく、何を行うかを指定できます (ただし、@WhozCraig で言及されているように、派生クラスは仮想関数をパブリックとして再実装できます)。

于 2013-09-09T15:00:25.950 に答える
2

私が質問を正しく理解している場合、利用可能なオプションの1つは、基本クラスで「pre-func()」メソッドを作成し、その関数に「Hello World」を出力させてから「func()」を呼び出すことです。そうすれば、派生クラスはすべて「func()」をオーバーライドしますが、「pre-func()」を介して API を呼び出します (明らかに、機能を正確に説明していないため、pre-func という用語は使用しません)。

于 2013-09-09T15:04:28.473 に答える