C ++如何从基类调用派生类中的方法

时间:2013-06-26 15:18:38

标签: c++ virtual-functions

我想要做的是Execute()运行并完成调用Base::Done()然后调用Derived::Done()。我这样做是因为BaseExecute会做一些事情,当它完成时会调用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();
}

2 个答案:

答案 0 :(得分:8)

您可以使用模板方法:

class Base
{
 public:
  void Execute()
  {
    BaseDone(42);
    DoDone(42);
  }
 private:
  void BaseDone(int code){};
  virtual void DoDone(int) = 0;
};

class Derived : Base
{
 public:
  void Run() { Execute(); }
 private:
  void DoDone(int code) { .... }
};

此处,Base控制在Execute()中如何使用自己的派生方法和派生方法,派生类型只需通过私有虚方法DoDone()实现该实现的一个组件。

答案 1 :(得分:3)

基类方法可以非常简单地调用派生方法:

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.
     };
     ...
 };