虛析構函式

2021-05-27 15:29:07 字數 646 閱讀 2262

1.當通過基類指標來刪除派生類物件時,如果基類的析構函式不是虛函式,如下例所示: 

#include

using namespace std;

class base

此時輸出為:

base constructed!

derived constructed!

base deconstructed!

可以發現,結果中沒有出現派生類物件的析構,那麼就會出現記憶體洩露的情況。所以此時需要將基類的析構函式改為虛函式,派生類物件的析構函式才會被呼叫。

即改為virtual ~base()

上例中,析構函式互為虛函式,但是析構函式的名字不同,之所以基類析構函式為虛,子類析構函式也為虛是因為類中析構函式只有乙個,系統預設能成為覆蓋的關係。

在base *pde=new derived中,是用基類指標來呼叫子類函式,從而能實現多型的呼叫。而不用derived *pde=new derived;

2.過載和覆蓋

兩者共同點就是函式名相同。

不同點:

a.過載是在同乙個類中定義的成員函式,而覆蓋是在基類和派生類中定義的函式,作用域不同。

b.過載的返回值、引數列表不同;而覆蓋的返回值、引數列表都要求相同

c.覆蓋函式前必須加關鍵字virtual。

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...