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

2021-06-23 00:44:21 字數 1332 閱讀 9080

書籍《effective c++》中的條款7 讀書筆記

條款7的內容,可以大致總結為下面幾個問題:

問題1:什麼是多型基類?

問題2:為什麼要把多型基類的析構函式宣告為virtual析構函式?

問題3:是不是應該把所有的類的析構函式宣告為virtual函式?

下面來詳細回答上面三個問題

問題1:什麼是多型基類?

多型基類

是由「多型」和「基類」兩個詞組成的,

本質上就是乙個類

。這個類符合兩個條件:

一是作為乙個基類。基類的意思相信大家都懂的,就是乙個類還派生了另外的類。

第二個條件是多型。所謂多型,就是指向基類物件的指標變數也可以指向派生類物件。

例如有如下乙個類

class aclass;

class bclass :public aclass;

aclass

*p=new bclass;

問題2:為什麼要把多型基類的析構函式宣告為virtual析構函式?

因為c++明白指出,當derived class物件經由乙個base指標刪除(delete),而該base class帶著乙個

non-virtual析構函式,會發生一種情況:

系統會只執行基類的析構函式,而不執行派生類的析構函式

。這樣子會造成乙個詭異的「區域性銷毀」物件的現象,就是base class成分會被銷毀,而drived class部分

則沒有被銷毀。

class aclass

~aclass();

class bclass :public aclass

~bclass();

int main()

執行結果為 :aclass destructor

如果將多型基類的析構函式宣告為虛析構函式,如

virtual

~bclass(){cout<<"bclass destructor"<

其他部分不變,在執行程式,

執行結果為:

bclass destructor

aclass destructor

問題3:是不是應該把所有的類的析構函式宣告為virtual函式?

當乙個class不企圖當做base class,令其析構函式為virtual往往是乙個餿主意

。因為如果定義了乙個虛函式,

為了能夠確定程式執行時呼叫的是哪個函式,系統需要建立起乙個虛函式表,這個表記錄著函式呼叫的一些

資訊,這樣子更加了記憶體的使用。

一般只將多型基類的析構函式定義為virtual析構函式。

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

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

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

結論1 polymorphic 帶多型性質的 base classes 應宣告乙個virtual 析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式。c 指出當derived class物件經由乙個base class指標被刪除,而該base class帶有乙...

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

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