析構函式的作用是在物件撤銷之前做必要的「清理現場」的工作。
當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情況:系統會只執行基類的析構函式,而不執行派生類的析構函式。
例12.3 基類中有非虛析構函式時的執**況。
為簡化程式,只列出最必要的部分。
#include
using namespace std;
class point//定義基類point類
//point類建構函式
~point();
class circle:public point//定義派生類circle類
//circle類建構函式
~circle( );
int main( )
這只是乙個示意的程式。p是指向基類的指標變數,指向new開闢的動態儲存空間,希望用detele釋放p所指向的空間。但執行結果為:
executing point destructor
表示只執行了基類point的析構函式,而沒有執行派生類circle的析構函式。原因是以前介紹過的。
如果希望能執行派生類circle的析構函式,可以將基類的析構函式宣告為虛析構函式,如
virtual ~point(){cout<<″executing point destructor″<
程式其他部分不改動,再執行程式,結果為
executing circle destructor
executing point destructor
先呼叫了派生類的析構函式,再呼叫了基類的析構函式,符合人們的願望。
當基類的析構函式為虛函式時,無論指標指的是同一類族中的哪乙個類物件,系統會採用動態關聯,呼叫相應的析構函式,對該物件進行清理工作。
如果將基類的析構函式宣告為虛函式時,由該基類所派生的所有派生類的析構函式也都自動成為虛函式,即使派生類的析構函式與基類的析構函式名字不相同。
最好把基類的析構函式宣告為虛函式。這將使所有派生類的析構函式自動成為虛函式。
這樣,如果程式中顯式地用了delete運算子準備刪除乙個物件,而delete運算子的操作物件用了指向派生類物件的基類指標,則系統會呼叫相應類的析構函式。
虛析構函式的概念和用法很簡單,但它在物件導向程式設計中卻是很重要的技巧。
專業人員一般都習慣宣告虛析構函式,即使基類並不需要析構函式,也顯式地定義乙個函式體為空的虛析構函式,以保證在撤銷動態分配空間時能得到正確的處理。
建構函式不能宣告為虛函式。這是因為在執行建構函式時類物件還未完成建立過程,當然談不上函式與類物件的繫結。
C 之虛析構函式
相信大家都已經清楚了虛函式這個概念。在c 中,建構函式不能宣告為虛函式,而析構函式卻可以宣告為虛函式,大家可能對為什麼要把析構函式宣告為虛函式很疑惑,下面,雲主 博主 就帶大家去會會這個虛析構函式 首先,先看一段 incldue using namespace std class base 建構函式...
C 之虛析構函式
虛析構函式 如果乙個類有子類,則這個類 父類 的析構函式必須是虛函式 如果父類的析構函式不是虛函式,則當 delete 刪除乙個指向子類物件的父類指標 時,將呼叫父類版本的析構函式,子類只釋放了來自於父類的那部分成員變數,而子類自己擴充套件的成員變數沒有被釋放,造成記憶體洩漏 include std...
C 之虛析構函式
問題1 什麼時候要用虛析構函式?答案 通過基類的指標來刪除派生類的物件時,基類的析構函式應該是虛的。這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。原因 用物件指標來呼叫乙個函式,有以下兩種情況 如果是虛函式,會呼叫派生類中的版本 如果是非虛函式,會呼叫指標所指型別的...