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