正在回答这个问题 - Pure virtual call in destructor of most derived class - 我尝试了一些代码来检查一些语法,并发现当调用sucessive析构函数时,它们会调用它们相关的虚函数。考虑下面的代码:为什么在析构函数中虚拟表设置回该级别?
class Base
{
public:
virtual void Method() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
Method();
}
virtual void Method()
{
cout << "D";
}
};
class DoubleD : public Derived
{
public:
~DoubleD()
{
Method();
}
virtual void Method()
{
cout << "DD";
}
};
int main(array<System::String ^> ^args)
{
DoubleD D;
DoubleD E;
return 0;
}
如所预期的,当对象被破坏时,它调用正确的方法(例如,第一最衍生,然后将第二个最导出)。
输出:DD D
我的问题是,这是为什么?既然你不打算在c'tor/d tor中调用虚函数,为什么虚表要“正确地展开”呢?
例如,我可以看到为什么最派生的工作,这是虚拟函数指针表在启动时的状态。但是为什么当调用Derived
的析构函数时,该表是否正确设置为指向该类实现Method
。
为什么不只是离开它,或者如果它很好,请将该值设置为NULL。
“将值设置为NULL”?设置*什么*值为空?!另请注意,C++中没有“vtable”。这是一个实现细节,如果你已经设法了解它,那么你可能真的很接近学习如何实现析构函数 - 为什么你停止阅读? – 2013-05-13 20:46:48
在附注上,将析构函数标记为虚拟。使用虚拟功能是一种很好的做法。 – bjskishore123 2013-05-13 20:49:30
“既然你不打算在c'tor/d tor中调用虚函数”:谁告诉你的?建议是要小心地打电话给他们,因为他们已经“解开”(就像你所说的那样),可能不会达到你的期望。 (如果它们是纯虚拟的,不要打电话给他们;这是不允许的。) – 2013-05-13 21:17:20