4级继承链中的C++ Virtual Destructors.

Mik*_*eyG 3 c++ virtual-destructor

我正在做虚拟析构函数的一个小实验来审查 - 想知道是否有人对以下内容有一个简单的解释(使用vs 2010):

我定义类层次结构ABCD,D继承C,C继承B,B继承A,A是Base;

跑了2个实验:

第一个实验 -

A有一个虚拟的析构函数.

B有一个非虚拟析构函数

C有一个虚拟的析构函数

D有一个非虚拟的析构函数

// ----------------------------

在D类型的堆上分配4个对象 - 在第3个点指向A*,B*和C*的指针 - 将第4个作为完整性的D*.删除所有4个指针.

正如我所料,在所有4个实例中,完整的析构函数链以相反的顺序从D向下执行到A,从而释放所有内存.

第二次实验 -

A具有非虚拟析构函数**将A更改为非虚拟

B有一个非虚拟析构函数

C有一个虚拟的析构函数

D有一个非虚拟的Distructor

在D类型的堆上分配4个对象 - 在前3个点指向A*,B*和C*的指针 - 将第4个作为完整性的D*.

删除C*和D*指针:完整的析构函数链以从D向下到A的相反顺序执行,释放所有内存.

删除B*:B然后运行析构函数(泄漏)

删除A*:只运行析构函数(泄漏)

任何人都可以解释为什么这是?

当在实验2中分配D类型opject时,它的直接基类(C)有一个虚拟析构函数 - 不能告诉编译器用Vptr跟踪它并知道内存类型?无论参考?

谢谢迈克

Oli*_*rth 6

当在实验2中分配D类型opject时,它的直接基类(C)有一个虚拟析构函数 - 不能告诉编译器用Vptr跟踪它并知道内存类型?无论参考?

没有.

在你的第二个测试用例中,AB没有vptrs/vtables.(即使他们这样做了,非虚拟成员函数仍然会静态解决,而不是动态解决.)

换句话说,基类不会从派生类"继承"信息(例如函数是否为虚函数).

  • 因为在第一个测试用例中,`B`的析构函数**是虚拟的; 如果成员函数在基类中是虚拟的,那么它在派生类中是虚拟的,即使您没有明确声明它也是如此. (2认同)