虛析構函式是為了解決這樣的乙個問題:基類的指標指向派生類物件,並用基類的指標刪除派生類物件。
舉例a* d = new b();(假定a
是基類,b
是從a繼承而來的派生類)
,那麼其(a
類)析構函式必
須是虛的,否則在
delete d時,
b類的析構函式將不會被
呼叫,因而會
產生記憶體洩漏和異常;
class base
virtual ~base(){}
};class derived: public base
; ~derived(){};
}void foo()
會發生動態繫結,它會先呼叫derived的析構函式,然後是base的析構函式。
如果不加virtual,delete pb只會執行base的析構函式,而不是真正的derived析構函式。
再看乙個例子:
class a{
public:
int a;
a(){cout<<"a"<
結果:有virtual時,a b c ~c ~a ~b
沒有virtual時,a b c ~a ~b
參考:1.
2.
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...