C 之虛析構函式

2021-07-30 13:01:33 字數 1113 閱讀 2785

問題1:什麼時候要用虛析構函式?

答案:通過基類的指標來刪除派生類的物件時,基類的析構函式應該是虛的。這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。

原因:用物件指標來呼叫乙個函式,有以下兩種情況:如果是虛函式,會呼叫派生類中的版本;如果是非虛函式,會呼叫指標所指型別的實現版本。析構函式也會遵循以上兩種情況。當物件出了作用域或是我們刪除物件指標,析構函式就會被呼叫。當派生類物件出了作用域,派生類的析構函式會先呼叫,然後再呼叫它父類的析構函式,這樣能保證分配給物件的記憶體得到正確釋放。但是,如果我們刪除乙個指向派生類物件的基類指標,而基類析構函式又是非虛的話, 那麼就會先呼叫基類的析構函式(上面第2種情況),派生類的析構函式得不到呼叫。這樣會造成銷毀物件不完全。

簡要解釋就是:析構函式執行時先呼叫派生類的析構函式,其次才呼叫基類的析構函式。如果析構函式不是虛函式,而程式執行時又要通過基類的指標去銷毀派生類的動態物件,那麼用delete銷毀物件時,只呼叫了基類的析構函式,未呼叫派生類的析構函式。這樣會造成銷毀物件不完全。

注意:並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式。

**例項如下:

class base

shape(int edge_length)

virtual ~shape()

~********()

};int main()

{ shape *x = new shape();

x->circumstance();

shape *y = new ********(10);

int num = y->circumstance();

cout《執行結果:

circumstance of base class.

circumstance of child class.

30shape destructure.

******** destructure.

shape destructure.

c 之虛析構函式

析構函式的作用是在物件撤銷之前做必要的 清理現場 的工作。當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情...

C 之虛析構函式

相信大家都已經清楚了虛函式這個概念。在c 中,建構函式不能宣告為虛函式,而析構函式卻可以宣告為虛函式,大家可能對為什麼要把析構函式宣告為虛函式很疑惑,下面,雲主 博主 就帶大家去會會這個虛析構函式 首先,先看一段 incldue using namespace std class base 建構函式...

C 之虛析構函式

虛析構函式 如果乙個類有子類,則這個類 父類 的析構函式必須是虛函式 如果父類的析構函式不是虛函式,則當 delete 刪除乙個指向子類物件的父類指標 時,將呼叫父類版本的析構函式,子類只釋放了來自於父類的那部分成員變數,而子類自己擴充套件的成員變數沒有被釋放,造成記憶體洩漏 include std...