天天看點

C++ 虛析構函數與析構函數的差別

先看下面代碼:

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。

繼續閱讀