先看下面的例子:
#include <iostream>
using namespace std;
// A是父类
class A
{
public:
A(){cout<<"A()"<<endl;}
virtual ~A(){cout<<"~A()"<<endl;}
};
// B是A的子类
class B : public A
{
public:
B(){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
};
void main()
{
A *a = new B;
delete a;
}
执行结果是:
如果去掉A类析构函数不是虚函数,即析构函数前没有virtual关键字,则执行结果如下:
从上面的例子中可以看出,如果父类A的析构函数不是虚函数的话,子类B的析构函数就不会被执行,那么在
A *a = new B;
时申请的资源就不会被释放,这显然不是我们所期望的,所以,对于例子这样情况,析构函数应该是虚函数。