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