【C++基礎 08】virtual析構函數的作用

在面嚮對象語言中,接口的多種不同的實現方式即爲多態。c++可以使用virtual來實現多態。

如果不使用virtual的話,C++對成員函數使用靜態聯編,而使用virtual,並且在調用函數時是通過指針或引用調用,C++則對成員函數進行動態編聯(也就是遲後綁定,運行的時候才確定調用哪個對象)。

關於virtual的用法比較簡單,不再複述,我們這次來看看virtual析構函數的作用。

1.示例

我們先來看一段代碼:

class A
{
public:
  ~A()
  {
    cout<<"~A()";
  }
};

class A1 : public A{
public:
  ~A1()
  {
    cout<<"~A1()";
  }
};

void main()
{
  A* a = new A1();//基類指針接受子類對象
  delete a;
  return;
}
咋一看好像沒什麼問題,但運行一下你會發現輸出的結果是~A()。

也就是說只析構了基類的對象,沒有釋放子類的對象,造成局部銷燬這種詭異的資源泄漏問題。

消除這種問題的做法也很簡單,給基類添加一個virtual析構函數,此後刪除子類就會銷燬整個對象。

2.實現:

class A
{
public:
	virtual ~A()
	{
		cout<<"~A()";
	}
};

class A1 : public A{
public:
	~A1()
	{
		cout<<"~A1()";
	}
};

void main()
{
	A* a = new A1();
	delete a;
	return;
}
加上virutal關鍵字後,運行結果:先是子類的析構~A1() 然後是基類的析構~A()。整個對象被銷燬,不存在局部銷燬問題。


一個比較好的判斷方式是:如果你的基類(base classes)設計是爲了多態用途,那麼它應該聲明一個virtual析構函數,如果classes帶有任何virtual函數,那麼它也應該有一個virtual析構函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章