書籍《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...