在物件導向語言中,介面的多種不同的實現方式即為多型。c++可以使用virtual來實現多型。
如果不使用virtual的話,c++對成員函式使用靜態聯編,而使用virtual,並且在呼叫函式時是通過指標或引用呼叫,c++則對成員函式進行動態編聯(也就是遲後繫結,執行的時候才確定呼叫哪個物件)。
關於virtual的用法比較簡單,不再複述,我們這次來看看virtual析構函式的作用。
我們先來看一段**:
class a
};class a1 : public a
};void main()
咋一看好像沒什麼問題,但執行一下你會發現輸出的結果是~a()。
也就是說只析構了基類的物件,沒有釋放子類的物件,造成區域性銷毀這種詭異的資源洩漏問題。
消除這種問題的做法也很簡單,給基類新增乙個virtual析構函式,此後刪除子類就會銷毀整個物件。
class a
};class a1 : public a
};void main()
加上virutal關鍵字後,執行結果:先是子類的析構~a1() 然後是基類的析構~a()。整個物件被銷毀,不存在區域性銷毀問題。
乙個比較好的判斷方式是:如果你的基類(base classes)設計是為了多型用途,那麼它應該宣告乙個virtual析構函式,如果classes帶有任何virtual函式,那麼它也應該有乙個virtual析構函式。
C 中virtual 析構函式
我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public clxba...
條款7 為多型基類宣告virtual析構函式
1.將析構函式宣告為virtual 當我們的類要作為基類的時候我們最好將其析構函式宣告為virtual型別,因為當我們用基類的指標指向乙個派生類,當我們要用基類指標析構掉這個派生類的時候,如果基類的析構函式不是virtual,那麼最終只有基類裡面宣告的變數被析構掉,而派生類裡面的變數很可能沒被析構掉...
條款7 為多型基類 宣告virtual析構函式
1 c 明確指出,當派生類物件經由乙個base class指標被刪除,而該base class帶著乙個non virtual析構函式,其結果未有定義 實際執行時通常發生得是子類物件得derived成分沒有被銷毀,消除這個問題得做法很簡單,給base類乙個虛擬構函式,此後刪除派生類物件就會如你想要得那...