我們已經介紹過析構函式(詳情請檢視:
c++析構函式),它的作用是在物件撤銷之前做必要的「清理現場」的工作。
當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情況:系統會只執行基類的析構函式,而不執行派生類的析構函式。
[例12.3] 基類中有非虛析構函式時的執**況。為簡化程式,只列出最必要的部分。
複製純文字複製
#include
using
namespace std;
class
point
//定義基類point類
//point類建構函式
~point
()//point類析構函式};
class
circle
:public point //定義派生類circle類
//circle類建構函式
~circle()
//circle類析構函式
private
:int radius;};
intmain()
#include using namespace std;
class point //定義基類point類
//point類建構函式
~point(){cout<<"executing point destructor"《這只是乙個示意的程式。p是指向基類的指標變數,指向new開闢的動態儲存空間,希望用detele釋放p所指向的空間。但執行結果為:
executing point destructor
表示只執行了基類point的析構函式,而沒有執行派生類circle的析構函式。
如果希望能執行派生類circle的析構函式,可以將基類的析構函式宣告為虛析構函式,如:
virtual ~point(){cout<<″executing point destructor″《最好把基類的析構函式宣告為虛函式。這將使所有派生類的析構函式自動成為虛函式。這樣,如果程式中顯式地用了delete運算子準備刪除乙個物件,而delete運算子的操作物件用了指向派生類物件的基類指標,則系統會呼叫相應類的析構函式。
虛析構函式的概念和用法很簡單,但它在物件導向程式設計中卻是很重要的技巧。
專業人員一般都習慣宣告虛析構函式,即使基類並不需要析構函式,也顯式地定義乙個函式體為空的虛析構函式,以保證在撤銷動態分配空間時能得到正確的處理。
建構函式不能宣告為虛函式。這是因為在執行建構函式時類物件還未完成建立過程,當然談不上函式與類物件的繫結。
虛析構函式的作用
析構函式的作用就在於我們呼叫完乙個類物件時,為了避免記憶體洩漏,我們必須刪除這個類物件,這時析構函式就派上用場了。但是,當我我們定義乙個基類指標指向派生類後,再刪除這個指標時我們會發現,程式只是呼叫了基類的析構函式,卻沒有呼叫派生類的析構函式。為了解決這個問題,虛析構函式閃亮登場!當!當!當!虛析構...
虛析構函式的作用
我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase public clxbase virtual clxbase virtual void dosomething class clxderiv...
虛析構函式的作用
虛析構函式的作用 析構函式的作用 類的析構函式是為了釋放記憶體資源,析構函式不被呼叫的話就會造成記憶體洩漏。虛析構函式 定義為虛析構函式是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。但並不是要把所有類的析構函式都寫成虛函式。只有當乙個類被用來作為基類的時候,才把析構函式寫...