代码如下:
#include <stdio.h>
class T0
{
public:
T0(){ printf(" T0()"); }
virtual ~T0(){ printf(" ~T0()"); }
};
class T00
{
public:
T00(){ printf(" T00()"); }
~T00(){ printf(" ~T00()"); }
};
class T1 :public T0,public T00
{
public:
T1(){ printf(" T1()"); }
virtual ~T1(){ printf(" ~T1()"); }
};
class T2 :public T1
{
public:
T2(){ printf(" T2()"); }
~T2(){ printf(" ~T2()"); }
};
int main()
{
T0 * pT0 = new T2();
delete pT0;
printf("\n-------------------------------------\n");
T1 * pT1 = new T2();
delete pT1;
printf("\n-------------------------------------\n");
T00 * pT00 = new T2();
delete pT00;
printf("\n-------------------------------------\n");
system("pause");
}
运行结果
得出的结论:如果用父类指针表示子类, 父类必须是虚析构函数, 如T0 和 T1, 释放指针时能正确释放内存, 如果指针父类没有虚析构函数,如 T00, 即使他的子类有虚析构函数,也不会调用,只是释放T00的内存,造成内存泄露。