C 中的虛析構函式的作用

2021-09-26 22:02:47 字數 1654 閱讀 4926

虛析構函式的作用:

當直接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...