1. 程式人生 > >C++解構函式後加上virtual的原因

C++解構函式後加上virtual的原因

C++解構函式加上virtual是為了防止記憶體洩漏。

用在C++實現多型的時候,其基類要加virtual。

原因跟動態繫結有關,大家都知道,多型是通過虛擬函式實現的,而虛擬函式又是通過動態繫結實現的。

先舉個例子:

class Base
{
	public:
	virtual void function()
	{
		cout<<"this is Base's function"<<endl;
	}		
	
	virtual ~Base()
	{
		cout<<"this is Base's destroy"<<endl;
	}
};

class Derived:public Base
{
	public:
	void function()
	{
		cout<<"this is Derived's function"<<endl;
	}
	
	~Derived()
	{
		cout<<"this is Derived's destroy"<<endl;
	}
};

int main()
{
	Base *ptr = new Derived();
	ptr->function();
	delete ptr;
	return 0;
}
上面的程式碼,我先寫了虛擬函式function,第31行就是動態繫結,而33行delete刪除的是Base型基類指標,此指標是沒有派生類Derived的解構函式的,所以如果不在基類的解構函式加上virtual的話,就不能動態繫結派生類的解構函式(當然解構函式的動態繫結你可以看出來跟一般函式的動態繫結相比是特殊的,解構函式的虛擬函式不用按照函式名來找對應的的函式)。一句話:基類的解構函式加了virtual就可以動態繫結派生類的解構函式,這樣的話,在執行多型後刪除其物件,就可以在刪除物件的時候執行派生類的析構函數了(當然執行基類的解構函式是一定會的)。否則不會執行派生類的解構函式。

程式碼輸出結果:

this is Derived's function

this is Derived's destroy

this is Base's destroy

你可以嘗試一下把基類的解構函式前的virtual刪掉(第9行),輸出結果將是:

this is Derived's function

this is Base's destroy


你可以觀察到,沒有執行派生類的解構函式