1. 程式人生 > >C++ 虛解構函式與解構函式的區別

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。