На C++ как вызвать метод производного класса из базового класса

что я хочу сделать это для 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();
}

2 ответов


вы можете использовать метод шаблона:

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

вот пример использования non-virtual идиома:

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

 class Derived {
     virtual void DoneImpl() { 
         // Do derived class work.
     };
     ...
 };