條款7 為多型的基類宣告虛析構函式。

2022-01-22 10:06:12 字數 964 閱讀 3856

任何的類只要帶有乙個virtual函式那麼就集合可以確定其應該有乙個virtual析構函式。

同樣的如果乙個函式不含有virtual函式,那麼通常意味著其不是乙個基類函式,而且為乙個不是基類的類宣告virtual的析構函式是十分糟糕的事情,不要這樣做。具體原因在下面:

1.首先,想要實現出virtual函式,物件必須要攜帶某些資訊,。資訊通過vptr來實現,這個vptr指向乙個由函式指標構成的陣列,即vtbl。盲目的去使用虛函式就會使得浪費資源。(一般人的經驗是,只有當函式需要使用乙個虛函式的時候才需要乙個虛的析構函式)

2.還有一種情況見下面的**:(乙個繼承來自string的類)

class specialstring : std:;string

specialstring * pss = new specialstring("

impending doom");

string * ps =pss;

...delete pss;//

這樣會造成災難,使得specialstring的析構函式並沒有被呼叫。

注意虛的析構函式還有一種十分經典的用法:純析構函式使得這個物件不能被建立物件。但是有時候又希望來使用純虛基類,另一方面又沒有可用的函式可以定義為純虛函式。那麼可以直接將析構函式就直接定義成乙個純的虛析構函式,這樣就解決了矛盾。記得應該給這個pure 的析構函式提供乙份定義,否則編譯器在進行析構操作的時候胡報錯的,應為派生類的析構函式總是要呼叫基類的析構函式的。例如:

class

awov

;

小結一下:虛函式的使用往往都是為了多型繼承之用,但是並不是所有的base class設計目的都是為了多型。例如stl以及string類等等,他們甚至都不作為基類來使用。

1.帶有多型性質的base class應該宣告乙個虛的析構函式

2.class的設計目的如果不是為了作為base class來使用,那麼就不要宣告虛析構函式。

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

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

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

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

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

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