给定以下示例:
class BaseClass
{
BaseClass()
{
};
virtual ~BaseClass()
{
this->Cleanup();
};
virtual void Cleanup()
{
// Do cleanup here.
};
};
class Level1DerivedClass : public BaseClass
{
Level1DerivedClass()
{
};
virtual ~Level1DerivedClass()
{
};
virtual void Cleanup()
{
// Call my base cleanup.
BaseClass::Cleanup();
// Do additional cleanup here.
};
};
class Level2DerivedClass : public Level1DerivedClass
{
Level2DerivedClass()
{
};
~Level2DerivedClass()
{
};
void Cleanup()
{
// Call my base cleanup.
Level1DerivedClass::Cleanup();
// Do additional cleanup here.
};
};
main()
{
Level2DerivedClass * derived2 = new Level2DerivedClass();
delete derived2;
return 0;
}
当我删除派生类引用时,我希望流程如下:
- 执行Level2DerivedClass析构函数。
- 因为Level1DerivedClass析构函数是虚拟的,所以它会被执行。
- 因为BaseClass析构函数是虚拟的,所以它会被执行。
- 因为BaseClass::Cleanup和Level1DerivedClass::Cleanup都是虚拟的,所以从BaseClass析构函数中的BaseClass 'this' 指针的调用将执行最派生类 - Level2DerivedClass::Cleanup的实现。
- Level2DerivedClass::Cleanup调用其父级的Cleanup实现。
- Level1DerivedClass::Cleanup调用其父级的Cleanup实现。
正在发生的事情是它以我期望的方式为每个继承级别(1-3)调用析构函数。但是当从BaseClass析构函数调用this->Cleanup()时,它只执行自己的实现。我不明白为什么会发生这种情况,因为通常当您实例化派生类指针,将其转换为基类指针并从基类指针调用虚拟方法(在本例中为“this”)时,它仍然运行派生类实现(“虚拟”的全部意义,是吗?)。在我的示例中,Level2DerivedClass::Cleanup和Level1DerivedClass::Cleanup永远不会被调用。
我以这种方式设置它的原因是我希望能够调用我的清理代码而不必破坏我的对象,这就是我从实际的析构函数体中抽象它的原因。
如果您对更合适的方法有建议,我会全力以赴。但我也想解释为什么我的设置不起作用 - 我误解了什么?
提前感谢您的宝贵时间。