1、一般情況下,如果class中有乙個函式為virtual時,那個可以認為該class具有多型性質,這時需要把該類的析構函式宣告為virtual性質的,因為如果不宣告為virtual性質的話,基類的析構函式將不被呼叫到,這時當derived class部分析構時,釋放的只是derived class部分的記憶體,base class部分記憶體沒有被釋放,造成記憶體洩露。所以不要隨便繼承乙個沒有virtual析構函式的類,stl中的string,vector等的析構函式就都沒有virtual性質的,所以使用是要小心。
2、並不是所有class的析構函式宣告為virtual都是好的,因為當類中含有virtual方法時,每個類都有包含乙個由函式指標構成的陣列,這個陣列由vptr(virtual table pointer)指標指出,主要用於在執行期決定哪乙個virtual函式被呼叫。所以含有virtual方法的 class肯定會較大一點,因此,在不需要用到多型性質時,不要隨意給class中的方法加上virtual關鍵字。
ps:析構的運作方式如下:最深層(most derived)的子類物件的析構函式最先呼叫,然後再到他的base class,跟建構函式正好相反
7 為多型基類宣告virtual虛構函式
優點 1.對於基類指標,當其指向衍生類時,可以完全銷毀所指向的物件。宣告virtual虛函式的缺點 1.增加物件大小 2.物件不再和其他語言 如c 內的相同宣告有著一樣的結構,因此就不能把它傳遞給其他語言所寫的函式,該物件也就不再具有移植性。注 1.帶多型性質的基類應該宣告virtual析構函式。任...
條款7 為多型基類宣告virtual析構函式
1.將析構函式宣告為virtual 當我們的類要作為基類的時候我們最好將其析構函式宣告為virtual型別,因為當我們用基類的指標指向乙個派生類,當我們要用基類指標析構掉這個派生類的時候,如果基類的析構函式不是virtual,那麼最終只有基類裡面宣告的變數被析構掉,而派生類裡面的變數很可能沒被析構掉...
條款7 為多型基類 宣告virtual析構函式
1 c 明確指出,當派生類物件經由乙個base class指標被刪除,而該base class帶著乙個non virtual析構函式,其結果未有定義 實際執行時通常發生得是子類物件得derived成分沒有被銷毀,消除這個問題得做法很簡單,給base類乙個虛擬構函式,此後刪除派生類物件就會如你想要得那...