先看下面代碼:
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。