虛析構函式
在c++中不能宣告虛建構函式,但是可以宣告虛析構函式。析構函式沒有型別,也沒有引數,和普通的函式成員相比,虛析構函式的情況略為簡單些。
虛析構函式的宣告語法為:
virtual ~類名();
如果乙個類的析構函式是虛函式,那麼由它派生的所有子類的析構函式也是虛函式。析構函式宣告為虛函式後,在使用指標或引用時可以動態繫結,實現執行時的多台,保證使用基類型別的指標就能呼叫適當的析構函式針對不同的物件進行清理操作。
虛析構函式的使用
當你有可能通過基類指標呼叫物件的析構函式時,就需要讓基類的析構函式稱為虛函式,否則會產生不確定的後果。
示例
#include
using
namespace
std;
class base
;base::~base()
class derived : public base
;derived::derived()
derived::~derived()
void fun(base *b)
int main()
輸出結果為:
base destructor
可以看到通過基類指標刪除派生類物件時,並沒有呼叫派生類物件的析構函式,也就意味著派生類derived中的成員p,沒有被刪除,記憶體空間沒有得到釋放,造成了記憶體洩露。為了避免上面的錯誤發生,需要將基類的析構函式宣告為虛函式即:
class
base
;
修改後程式輸出資訊為:
derived destructor
base
desturctor
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...