5

重複の可能性:
子に同じ仮想関数を強制的に親仮想関数を最初に呼び出す方法

各派生クラスが特定の仮想関数をオーバーライドし、その親クラスの仮想関数を呼び出すことによってその実装を開始するクラス階層があります。目標は、派生した各実装を実行することですが、私はそれを行う方法が好きではありません。

たとえば、私はこのクラスを持っています:

class base
{
public:
  void do_stuff() { do_something(); }
  virtual void do_something() { }
};

次に、このクラスをいくつかのレベルで導き出します。

class derived_10:
  public derived_9 // which inherit from derived_8 and so on until derived_0
                   // which inherit from base
{
public:
  virtual void do_something()
  {
    // this will also call derived_8::do_something() and so on
    // until base::do_something()
    derived_9::do_something();

    // then, some stuff
  }
};

base :: do_stuff()が呼び出されたときに、派生クラスがこれを実行することを期待せずに、すべてのderived_x :: do_something()が順番に呼び出されるようにするソリューションを探しています。この動作を実現するための最良の方法についてのアイデアはありますか?

4

1 に答える 1

3

私は以前に非常によく似た質問をしました:オーバーライドされたクラスメソッドをC++のチェーンとして呼び出す

私が受け入れた答えは、あなた自身の解決策を示していました。しかし、私はあなたに代替案についての考えを与えることができます。コンストラクタとデストラクタはすでにC++でこの動作をしているので、階層内のクラスに属するオブジェクトの構築または破棄中に作業が行われるように、コードの再構築を検討することをお勧めします。しかし、これを努力する価値があるかどうかはわかりません。一方、テンプレートメタプログラミングとプリプロセッサの魔法から何が得られるかはわかりません。

于 2012-04-24T19:38:43.550 に答える