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

2021-06-22 07:37:45 字數 733 閱讀 4771

結論1:polymorphic(帶多型性質的)base classes 應宣告乙個virtual 析構函式。如果class帶有任何virtual函式,它就應該擁有乙個virtual析構函式。

c++指出當derived class物件經由乙個base class指標被刪除,而該base class帶有乙個non-virtual析構函式,其結果未有定義,實際執行時通常發生的是物件的derived成分沒被銷毀。

stl中的容器都不帶virtual析構函式,所以不要企圖繼承乙個標準容器。

當希望擁有抽象class,但手上沒有任何pure virtual 函式,則可以為希望成為抽象的那個class宣告乙個pure virtual 析構函式。但必須為這個pure virtual析構函式提供乙份定義。因為析構函式的運作方式是最深層派生的那個class其析構函式最先被呼叫,然後是其每乙個base class的析構函式被呼叫。

結論2:classes 的設計目的如果不是作為base classes使用,或不是為了具備多型性(polymorphically)就不該宣告virtual析構函式。

例如:標準string和stl容器都不被設計作為base classes使用。

某些classes的設計目的是作為base classes使用,但不是為了多型用途。例如標準程式庫中的input_iterator_tag 和 條款06中的uncopyable,它們並非被設計用來「經由base class介面處置derived class物件「,因此不需要virtual析構函式。

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

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

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

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

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

總結 1.帶有多型性質的基類,應該將其析構函式宣告為virtual,如果class帶有任何虛函式,他就應該有乙個virtual的析構函式。因為如果乙個基類的指標指向派生類的物件,而這個基類的析構函式不是虛函式的話,那麼在銷毀這個指標的時候,派生類對物件中的派生類成份沒有被銷毀,這樣會造成詭異的區域性...