虛析構函式

2021-06-01 10:05:54 字數 864 閱讀 9588

虛析構函式是為了解決這樣的乙個問題:基類的指標指向派生類物件,並用基類的指標刪除派生類物件。

舉例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 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...