虛析構函式

2021-06-01 22:16:42 字數 908 閱讀 2097

所謂虛析構函式就是用virtual關鍵字修飾的析構函式。比如:

class   a ;

這樣的就是虛析構函式。

那麼就出現了乙個問題,為什麼要使用虛析構函式呢?請看下面這個例子:

class  a ;

a::a()

a::~a()

class b : public a ;

b::b()

b::~b()

int main()

發動你那上帝賜予的智商高達300的大腦思考一下,這段看似簡單的程式的輸出結果是什麼。再去自己程式設計驗證一下,看計算機的大腦和你的是否一樣。

如果猜的不錯的話(這顯然是廢話啊),是不是很多人猜想會輸出:

a()b()

~b()

~a()

那只有恭喜你又取得了進步,因為你猜錯了!程式的實際輸出結果是:

a()b()

~a()

是不是很詭異啊?明明是呼叫了b的建構函式,卻沒有呼叫到b的析構函式。不會是編譯器出問題了吧?告訴你乙個真理,寫編譯器的哥們兒不是一般的高手,他們是很牛的一群人。至於牛到什麼程度,反正不是你我在目前這個階段能望其項背的,所以不用懷疑編譯器。程式之所以輸出這樣的結果,是因為試圖通過乙個基型別的指標來刪除派生類物件。釋放這個指標所指向的記憶體區域時,只會調到基類a的析構函式,這就是語法規則。

這肯定不是我們想要的啊,因為通常情況下b的析構函式肯定不是這麼簡單(實際上這只析構函式是沒有意義的,舉例需要啊),裡面通常是是釋放建構函式申請的記憶體,調不到b的析構,就造成了記憶體洩露了。怎麼解決這個問題呢?

這就到重點了(說了這麼多才到重點,正是繞啊!汗~~~),利用虛析構就可以解決這個問題。在a的析構函式之前新增virtual關鍵字即可。自己驗證一下,可以看到輸出結果為:

a()b()

~b()

~a()

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...