有這樣一種場景:
class a
~a() };
class b : public a
~b() };
class c : public b
~c()
};
我們定義了三個類,b繼承a,c繼承b
void todelete(a *a)
int main()
執行結果:
可以看到,我a、b、c的建構函式都執行了,這很正常,但是析構時,只有a的析構函式被執行了,這了並沒有發生多型行為,這就造成了我們new了三塊記憶體但只刪除了一塊,造成記憶體洩露,這就要用到虛析構函式
我們為類的析構函式加上virtual關鍵字
class a
virtual ~a() };
class b : public a
virtual ~b() };
class c : public b
virtual ~c()
};
執行結果:
解決!*這樣我們就可以實現通過父類的指標,釋放所有的子類資源,把所有的子類物件的析構函式都執行一遍
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...