在面嚮物件語言中,介面的多種不同的實現方式即為多型。c++可以使用virtual來實現多型。
如果不使用virtual的話,c++對成員函式使用靜態聯編,而使用virtual,並且在呼叫函式時是通過指標或引用呼叫,c++則對成員函式進行動態編聯(也就是遲後繫結,執行的時候才確定呼叫哪個物件)。
關於virtual的用法比較簡單,不再複述,我們這次來看看virtual解構函式的作用。
我們先來看一段**:
class a咋一看好像沒什麼問題,但執行一下你會發現輸出的結果是~a()。};class a1 : public a
};void main()
也就是說只析構了基類的物件,沒有釋放子類的物件,造成區域性銷燬這種詭異的資源洩漏問題。
消除這種問題的做法也很簡單,給基類新增一個virtual解構函式,此後刪除子類就會銷燬整個物件。
class a加上virutal關鍵字後,執行結果:先是子類的析構~a1() 然後是基類的析構~a()。整個物件被銷燬,不存在區域性銷燬問題。};class a1 : public a
};void main()
一個比較好的判斷方式是:如果你的基類(base classes)設計是為了多型用途,那麼它應該宣告一個virtual解構函式,如果classes帶有任何virtual函式,那麼它也應該有一個virtual解構函式。
基函式解構函式virtual
第一種 基函式解構函式無virtual includeclass a a 增加了虛擬關鍵字 class b public a b int main int argc,char ar 執行結果 第二種 基函式解構函式有virtual includeclass a virtual a 增加了虛擬關鍵字 ...
virtual解構函式
帶多型性質的base class應該宣告一個virtual解構函式。如果class帶有任何virtual函式,它就應該有一個virtual解構函式。class設計的目的如果不是作為base class使用,或不是為了具備多型性質,就不應該生命virtual解構函式。因為只有base class的解構...
C 中 virtual 解構函式
為什麼基類的解構函式是虛擬函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。a.第一段 includeusing namespace std class a a void f class b public a b void f int main 執行結果 b f...