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跟踪它并知道内存类型?无论参考?
谢谢迈克
当在实验2中分配D类型opject时,它的直接基类(C)有一个虚拟析构函数 - 不能告诉编译器用Vptr跟踪它并知道内存类型?无论参考?
没有.
在你的第二个测试用例中,A并B没有vptrs/vtables.(即使他们这样做了,非虚拟成员函数仍然会静态解决,而不是动态解决.)
换句话说,基类不会从派生类"继承"信息(例如函数是否为虚函数).
| 归档时间: |
|
| 查看次数: |
1531 次 |
| 最近记录: |