虛析構函式之實踐

2021-08-26 08:01:23 字數 812 閱讀 7093

看了不少虛函式方面的文章,但對於虛析構函式在功能實現上還是不甚理解,於是決定實踐一番,可讓我收益匪淺啊

首先定義乙個沒有虛函式的基類:

#include#includeusing namespace std; class sphere ; class ball:public sphere ; sphere::sphere(double initialradius):radius(initialradius) double sphere::getradius()const void sphere::display()const void test(sphere &_sphere)

執行結果如下:

當基類中需要在派生類中重寫(override)的函式沒有宣告為虛函式時(宣告前加virtual),由基類型別定義的派生類物件沒有呼叫與派生類相應的成員函式和析構函式。而是直接呼叫了基類的成員函式和析構函式。這當然不是我們所要的。

修改後的基類和派生類如下(新增了虛函式機制):

#include#includeusing namespace std; class sphere ; class ball:public sphere ; sphere::sphere(double initialradius):radius(initialradius) double sphere::getradius()const void sphere::display()const { cout<

當對基類的成員函式和析構函式宣告為虛函式時,是根據物件的實際型別來確定要執行的函式的。需要注意的是,當呼叫了派生類的析構函式時,自動呼叫了基類的析構函式。而基類的析構函式不為虛函式時,則有可能造成記憶體洩露。

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

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

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

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

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

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