我想要做的是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();
}
答案 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.
};
...
};