为什么在析构函数中将虚拟表设置回该级别?

T. *_*ley 2 c++ virtual-functions

遵循这个问题 - 在大多数派生类的析构函数中进行纯虚拟调用 - 我尝试了一些代码来检查一些语法,并发现当调用过多的析构函数时,它们会调用它们相关的虚函数.考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当对象被破坏时,它会调用正确的方法(例如,首先是派生的最多,然后是派生的第二个).

输出:DD D.

我的问题是,为什么这有效?由于您不打算在c'tor/d'tor中调用虚函数,为什么虚拟表会正确"展开".

例如,我可以看到为什么导出最多的一个工作,这是虚拟函数指针表在启动时所处的状态.但是,为什么,当Derived调用析构函数时,表是否正确设置为指向该类的实现Method.

为什么不离开它,或者如果它很好,将值设置为NULL.

Pet*_*ker 6

由于您不打算在c'tor/d'tor中调用虚函数,为什么虚拟表会正确"展开".

前提是错误的.从构造函数或析构函数调用虚函数没有任何问题,前提是您知道它们是如何工作的.如您所见,动态类型是正在运行的构造函数或析构函数的类型,因此您不会对尚未构造或已被销毁的对象部分进行虚拟调用.