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

2021-09-16 14:19:58 字數 1470 閱讀 4179

1 c++明確指出,當派生類物件經由乙個base class指標被刪除,而該base class帶著乙個non-virtual析構函式,其結果未有定義---實際執行時通常發生得是子類物件得derived成分沒有被銷毀,消除這個問題得做法很簡單,給base類乙個虛擬構函式,此後刪除派生類物件就會如你想要得那般,是的,他會消除整個物件,包括派生類成分

任何class只要帶virtual函式幾乎確定應該有乙個vritual 析構函式,如果class不含virtual函式,通常表示它並不意味著用作class,當class不企圖當作virtual class,令其是個virtual 函式是個餿主意,因為virtual 會有乙個vptr指標,物件體積會增加2 即使class完全不帶virtual 函式,被non-virtual析構函式問題給咬傷還是有可能的,比如用string型別或者stl容器作為基類,當把派生類物件轉為為基類時,然後將轉換所得的基類指標delete掉時,你立即就會被流放到「行為不明確 」惡地上

#include #include using namespace std; 

class specialstring :public string

~specialstring()

private:

string str;

};int main()

3 純虛函式是不能被例項化,也就是說,不能夠建立物件,但是有時候你希望擁有抽象類,但手中沒有純虛函式怎麼辦?由於抽象類企圖被用作乙個base class,但由於抽象類應該有個虛析構函式,並且由於純虛函式會導致抽象類,因此解法很簡單,為你希望成為抽象的那個class宣告乙個純虛析構函式

class wow

;

析構函式的執行方式是,最深層派生的那個class其析構函式現被呼叫,然後是其每乙個base class的析構函式被呼叫,編譯器會在wow的派生類的i狗函式中建立乙個對~wow的呼叫動作,所以你必須要為這個函式提供乙個定義,聯結器會發生抱怨給base class乙個虛析構函式,這個規則只適合用於帶多型的base class上,這種基類的設計目的是為了用來通過基類處理派生類物件(父類作為介面,父類指標指向子類物件)

請記住:

多型性質的基類應該宣告乙個虛析構函式,如果class帶有虛函式,他就應該擁有乙個虛析構函式

classes的設計目的如果不是作為乙個base class,或不是為了具有多型性,就不該宣告virtual析構函式

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

基類指標指向子類物件。子類物件必須位於堆。因此為了避免洩漏記憶體資源,當指標不使用時,delete掉每乙個物件非常重要。但是如果基類的析構函式不宣告為virtual。那麼指向子類物件的指標delete時,析構掉的成分都是基類的,而子類的成分沒有被識別出來,而未被析構掉。這樣就造成資源浪費。給基類析構...

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

1.將析構函式宣告為virtual 當我們的類要作為基類的時候我們最好將其析構函式宣告為virtual型別,因為當我們用基類的指標指向乙個派生類,當我們要用基類指標析構掉這個派生類的時候,如果基類的析構函式不是virtual,那麼最終只有基類裡面宣告的變數被析構掉,而派生類裡面的變數很可能沒被析構掉...

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

現在需要一種設計,要設計乙個類記錄時間,但是記錄時間的方式有很多,可以通過手機mobileclock,可以通過水鐘waterclock等。所以要這種實現的方式 class timekeeper class mobileclock public timekeeper class waterclock ...