#include <stdio.h>
class A
{
public:
A() { printf("A\n"); }
~A() { printf("~A\n"); }
};
class B : public A
{
public:
B() { printf("B\n"); }
~B() { printf("~B\n"); }
};
int main()
{
A *p = new B;
delete p;
return 0;
}
执行结果:
A
B
~A
基类析构函数加上virtual再试试
#include <stdio.h>
class A
{
public:
A() { printf("A\n"); }
virtual ~A() { printf("~A\n"); }
};
class B : public A
{
public:
B() { printf("B\n"); }
~B() { printf("~B\n"); }
};
int main()
{
A *p = new B;
delete p;
return 0;
}
执行结果:
A
B
~B
~A
如果基类的析构函数不是虚函数,那么delete基类指针不能释放子类对象,不会调用子类对象的析构函数,这种做法是不完善的。
如果基类的析构函数是虚函数,那么delete基类指针是可以调用子类对象的析构函数的。