基類析構函式為virtual的好處

2021-07-10 14:11:40 字數 635 閱讀 6020

class base

...

};class child:public base

};int main()

上面**執行時,在生成child物件c時,實際上先呼叫基類base的建構函式,然後再呼叫child類的建構函式。當撤銷c時,先呼叫child的析構函式,然後在呼叫base的析構函式,也就是說,無論基類的析構函式是否為虛構函式,肯定會依次呼叫其基類的析構函式。根本原因:上面所有物件都存在於棧中,當其離開作用域時,該物件會被自動撤銷。

然而為什麼還要搞個虛構函式呢?

這是因為多型的存在。

base *pbase;

child c;

pbase =& c;

那麼,當pbase被撤銷時呢?如果base的析構函式不是virtual,那麼根據靜態聯編,顯然會呼叫base的析構函式,而不會呼叫child類的析構函式。而如果base的析構函式改為virtual,當pbase指標被撤銷時,就會先呼叫child類析構函式,再呼叫base類的析構函式。根本原因:上面過程是動態聯編,在堆中進行,如果不將基類析構函式設定為virtual,則會造成記憶體洩露。基類析構函式設定為virtual後,所有派生類的析構函式都將會是virtual。

為多型基類宣告virtual析構函式

書籍 effective c 中的條款7 讀書筆記 條款7的內容,可以大致總結為下面幾個問題 問題1 什麼是多型基類?問題2 為什麼要把多型基類的析構函式宣告為virtual析構函式?問題3 是不是應該把所有的類的析構函式宣告為virtual函式?下面來詳細回答上面三個問題 問題1 什麼是多型基類?...

為多型基類宣告virtual析構函式

一 中心內容 1 polymorphic 帶多型性質的 base classes應該宣告乙個virtual析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式 2 classes的設計目的如果不是作為base classes使用,或不是為了具備多型性,就不該宣告...

7 為多型基類宣告virtual析構函式

1 一般情況下,如果class中有乙個函式為virtual時,那個可以認為該class具有多型性質,這時需要把該類的析構函式宣告為virtual性質的,因為如果不宣告為virtual性質的話,基類的析構函式將不被呼叫到,這時當derived class部分析構時,釋放的只是derived class...