【发布时间】:2012-06-04 23:09:35
【问题描述】:
举个例子:
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 中的“this”指针调用em>BaseClass 析构函数将执行最派生类的实现 - Level2DerivedClass::Cleanup。
- Level2DerivedClass::Cleanup 调用其父级的 Cleanup 实现。
- Level1DerivedClass::Cleanup 调用其父级的 Cleanup 实现。
正在发生的事情是,它以我期望的方式为每个继承级别 (1 - 3) 调用析构函数。但是当 this->Cleanup() 从 BaseClass 析构函数中调用时,它只执行自己的实现。我不明白为什么会发生这种情况,因为通常当您实例化派生类指针,将其转换为基类指针并从基类指针调用虚拟方法(在本例中为“this”)时,它仍然运行派生类实现(“虚拟”的全部意义,是吗?)。在我的示例中,Level2DerivedClass::Cleanup 和 Level1DerivedClass::Cleanup 永远不会被调用。
我这样设置的原因是我希望能够调用我的清理代码而不必销毁我的对象,这就是我从实际的析构函数体中抽象它的原因。
如果您对更合适的方法提出建议,我会全力以赴。但我也想解释一下为什么我的设置不起作用 - 我误解了什么?
提前感谢您的宝贵时间。
【问题讨论】:
-
这可以编译吗?错误:'BaseClass::BaseClass()' 是私有的
-
亚历山德罗,对不起。这不是真正的代码,只是代表我在我的程序中尝试做的一个示例。
标签: c++ function inheritance methods virtual