C++ 虛解構函式與解構函式的區別
阿新 • • 發佈:2018-11-12
先看下面程式碼:
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。