虛析構函式的作用:
當直接delete子類的指標物件時,delete會先呼叫子類的析構函式,再呼叫父類的析構函式。
#includeusing namespace std;
class aa
~aa()
virtual void print()
protected:
int a;
private:
};class bb:public aa
~bb()
virtual void print()
protected:
private:
int b;
};void howtodelete(aa *pbase)
void main()
實驗現象如下:
然而,當把子類指標傳給父類指標做形參的函式,將子類指標轉變為父類指標時,由於未把父類的析構函式定義為虛函式,所以此時在howtodelete()中,delete pbase;時,編譯器只會執行靜態聯編,去呼叫父類物件的析構函式。而導致子類物件的析構函式並未利用c++中類指標的多型性得以呼叫,而無法實現子類的成員的記憶體釋放(這也是我們要把父類中的析構函式定義成虛析構函式的目的),這沒有實現動態聯編。
將父類的析構函式定義為虛函式。
**如下:
#includeusing namespace std;
class aa
virtual ~aa()
protected:
int a;
private:
};class bb:public aa
~bb()
protected:
private:
int b;
};void howtodelete(aa *pbase)
void main()
執行結果如下:將基類aa的虛構函式定義為虛析構函式,在子類bb的物件傳給父類指標形參pbase後,將pbase父類指標delete時,由於c++的類指標的多型特性,先釋放了bb的物件的所有成員占用的的記憶體。之後呼叫父類aa類的析構函式,釋放繼承自aa類的成員所占用的記憶體(自定義aa類的析構函式,來釋放aa類中的成員所占用的記憶體空間)。這樣一來,就實現了利用c++中類指標的多型特性,使用虛析構函式先釋放子類的成員占用的記憶體空間,再釋放父類的成員所占用的記憶體。
簡而言之,虛析構函式,還是利用了c++類指標的多型特性,使得父類指標根據其指向的具體物件(父類或子類),來呼叫相應的父類(先子類後父類)的析構函式,來實現多型(動態聯編)。使得子類中的自定義成員得以釋放,以免未呼叫子類的析構函式,造成記憶體洩漏。
C 中虛析構函式的作用
我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public clxba...
C 中虛析構函式的作用
收藏 我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public cl...
C 中虛析構函式的作用
c 中虛析構函式的作用 class clxbase virtual clxbase virtual void dosomething class clxderived public clxbase clxderived void dosomething clxbase ptest new clxde...