先看下面代码:
class Parent
{
public:
Parent();
~Parent();
};
Parent::Parent()
{
cout << "基类构造...." << endl << endl;
}
Parent::~Parent()
{
cout << "基类析构..." << endl << endl;
}
class Child :public Parent
{
public:
Child();
~Child();
};
Child::Child()
{
cout << "子类构造..." << endl << endl;
}
Child::~Child()
{
cout << "子类析构..." << endl << endl;
}
int main()
{
Parent* pObj = new Child();
delete pObj;
}
以上main函数执行结果为:
基类构造....
子类构造...
基类析构...
通过结果可以看出子类的析构函数没有调用。
修改代码将上面的基类和子类的析构函数都改成一下:
virtual ~Parent();
virtual ~Child();
执行结果如下:
基类构造....
子类构造...
子类析构...
基类析构...
比较2次结构可以看出
1、就是一个在析构的时候执行了子类的析构函数,一个在析构的时候没有执行子类的函数。
换句话说当加了virtual 后,就会先执行子类的析构函数,再执行基类的析构函数。
2、不执行析构函数,就可能会存在内存泄露。
很明显,不加virtual的情况下,子类的析构函数没有执行。
那什么情况下用virtual析构函数呢?
个人理解是,C++的特性之一就是多态,当需要用一个基类的指针new子类的对象的时候,在这种情况下,构造的时候基类和子类都有,所以析构的时候,也应该都需要,所以要加上virtual。