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

C++ how to call method in derived class from base class

本文关键字:方法 派生 调用 基类 C++      更新时间:2023-10-16

我想做的是让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();
}

您可以使用模板方法:

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()来实现该实现的一个组件。

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

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