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

2022-07-19 12:21:12 字數 517 閱讀 4580

1. 如果乙個類將要作為基類,那麼它應該具有乙個虛析構函式以防止delete經由基類指標指向的派生類物件時發生的"區域性銷毀"問題,避免造成記憶體洩露,資料結構敗壞,在偵錯程式上浪費時間等問題;任何帶有虛函式的類幾乎肯定需要乙個虛析構函式.

2. 在不必需的情況下不應該將成員函式設為虛函式,否則,如果導致乙個本來沒有虛函式的類帶有虛函式,那麼它就會增加乙個隱含的vptr(virtual table pointer)指標(指向虛函式表用於支援動態繫結),在這種情況下,類的"體積"增加,不僅由於增加的一層間接性降低了效率,同時也可能由於體積的增加造成本來可以放入快取器的它無法被放入快取器等問題.

3. 最好不要繼承沒有虛析構函式的類(理由見1),包括所有的stl容器,並不是所有基類的設計目的都是為了多型用途.

4. 可以使乙個類帶有純虛函式而成為抽象基類,但是必需給這個析構函式乙個定義(因為派生類析構函式的呼叫必然導致基類析構函式的呼叫).

5.析構函式的運作方式是:最深層派生的那個class其析構函式最先被呼叫(dog--anmial)

**:

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

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

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

1 任何帶有虛函式的類都幾乎確定應該定義乙個虛析構函式。乙個經驗是 只有當類含有至少乙個virtual函式才會為它宣告virtual析構函式。2 如果乙個類不含有virtual函式,通常表示它並不意圖作為基類 當類不意圖作為基類,令其析構函式為virtual是個餿主意。因為有虛函式,該類就要有指向虛...

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

條款07 為多型基類宣告virtual析構函式 1.c 明確指出,當子類物件經由乙個基類指標刪除,而該基類帶著乙個non virtual析構函式,其結果未有定義。實際執行時通常發生的是物件的derived成分沒有被銷毀。也就是不光子類 裡面的成員變數可能沒被銷毀,而子類的析構函式也未能執行起來。而基...