C 之基類的析構函式要宣告成虛函式

2021-09-29 14:46:33 字數 715 閱讀 3575

原因:

在公有繼承中,基類的虛構函式如果不宣告成為虛函式,那麼銷毀派生類時有可能造成資源洩漏

class

base;~

base()

;};class

derived :public base;~

derived()

;};void

main()

這種情況會發生銷毀不完全的情況,因為delete p呼叫的是宣告型別(即基類)的析構函式,所以只能銷毀基類物件而無法銷毀派生類物件。

修改後:

class

base

;virtual

~base()

;};class

derived :public base;~

derived()

;};void

main()

當基類的析構函式宣告為虛函式,那麼派生類的析構函式也是虛函式,此時呼叫delete p時發生動態繫結,執行時會根據實際型別呼叫該物件的虛函式。

當然,並不是要把所有類的析構函式都寫成虛函式。只有當乙個類是基類(即希望被繼承)的時候才需要宣告成虛函式,因為虛函式的作用是實現多型,而多型是建立在繼承的基礎上。單一類不能把析構函式寫成虛函式,因為會產生額外的開銷,比如虛表的建立和虛指標的定義。

effective 為多型基類宣告虛析構函式

條款07這裡需要補充的知識點 我覺得很重要 因為虛函式的作用是為了動態聯編 實現多型 而為了實現動態聯編,物件需要額外多出vptr指標,會增加體積 sizeof可以明顯看出 vptr指向乙個由函式指標構成的陣列,稱為vtbl 虛表 每乙個帶有虛函式的類都有乙個相應的vtbl,實際被呼叫的函式取決於該...

基類虛析構函式

why虛析構函式?主要還是由於基類指標或引用可以不進行顯示型別轉換的情況下指向派生類物件。同時通過引用或者指標或引用呼叫方法時遵循 例如 定義了基類brass,派生類brassplus 如果viewacct 不是虛方法,則b1 ref.viewacct 和b2 ref.viewacct 均是使用br...

關於基類為什麼要宣告析構函式

include using namespace std class base public base cout base base cout base public concrete cout concrete concrete cout concrete base base new concret...