7

私がやりたいことは、Execute()実行して完了し、Base::Done()を呼び出してから を呼び出すことDerived::Done()です。私がこれを行っているのは、BaseクラスExecuteが何かを実行し、完了したらDerived::Done(). 私はそれを正しく説明していると思います。タスクが完了したときに呼び出されるリスナーのようなものです。Baseクラスがクラスを呼び出す方法にちょっとこだわっていますDerived

class Base
{
  virtual void Done(int code){};
  void Execute();
}

void Base::Execute()
{
}


class Derived : Base
{
  void Done(int code);
  void Run();
}

Derived::Done(int code)
{
}

void Derived::Run()
{
    Execute();
}
4

2 に答える 2

4

基本クラス メソッドは、派生メソッドを非常に簡単に呼び出すことができます。

void Base::Execute()
{
    Done(42);
}

基本クラスの Done() を派生クラスの前に呼び出すには、派生クラス メソッドの最初のステートメントとして呼び出すか、非仮想イディオムを使用します。

派生クラス メソッドの先頭で呼び出す例を次に示します。これは、派生クラスに依存して正しく処理されます。

void Derived::Done(int code)
{
    Base::Done(code);
}

非仮想イディオムの使用例を次に示します。

class Base
{
    void Done(int code){
        // Do whatever
        DoneImpl(); // Do derived work.
    }
    virtual void DoneImpl() { };
    ...
 };

 class Derived {
     virtual void DoneImpl() { 
         // Do derived class work.
     };
     ...
 };
于 2013-06-26T15:28:20.800 に答える