條款07這裡需要補充的知識點(我覺得很重要):
因為虛函式的作用是為了動態聯編(實現多型),而為了實現動態聯編,物件需要額外多出vptr指標,會增加體積(sizeof可以明顯看出),vptr指向乙個由函式指標構成的陣列,稱為vtbl(虛表),每乙個帶有虛函式的類都有乙個相應的vtbl,實際被呼叫的函式取決於該物件的vptr所指的那個vtbl。(vptr的分步初始化知識點見筆記)
1.由於抽象類總是被企圖當作乙個基類,又由於多型基類為了防止記憶體洩漏,應該有個虛析構函式,因此,解決辦法就是為這個抽象類宣告乙個純虛析構函式。
2.但又因為派生類物件析構時需要呼叫抽象類(基類)的析構函式(回顧一下析構函式的運作方式:最遠的派生類的析構函式最先被呼叫,然後是各個基類的析構函式被呼叫,和建構函式的呼叫順序恰好相反),而抽象類的純虛構函式是沒有函式體的,這樣就會報錯。所以解決辦法是在抽象類的類外實現其函式體,而不是在派生類中重寫,這是純虛析構函式和其它純虛函式相比的特殊之處。(詳見下文「純虛函式也可以有函式體」);
例子如下:
#include
using
namespace std;
class
base
;base::
~base()
//純虛函式也可以有函式體
class
derive
:public base
//派生類的析構函式,是虛函式(省略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.對於基類指標,當其指向衍生類時,可以完全銷毀所指向的物件。宣告virtual虛函式的缺點 1.增加物件大小 2.物件不再和其他語言 如c 內的相同宣告有著一樣的結構,因此就不能把它傳遞給其他語言所寫的函式,該物件也就不再具有移植性。注 1.帶多型性質的基類應該宣告virtual析構函式。任...