gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:36:23 25 4
gpt4 key购买 nike

跟随这个问题 - Pure virtual call in destructor of most derived class - 我尝试了一些代码来检查一些语法,发现随着连续的析构函数被调用,它们调用了它们相关的虚函数。考虑这段代码:

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。

最佳答案

Since you are not meant to call virtual functions in a c'tor/d'tor, why does the virtual table "unwind" correctly.

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

关于c++ - 为什么在析构函数中将虚拟表设置回该级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16530761/

25 4 0