相信大家都已經清楚了虛函式這個概念。在c++中,建構函式不能宣告為虛函式,而析構函式卻可以宣告為虛函式,大家可能對為什麼要把析構函式宣告為虛函式很疑惑,下面,雲主(博主)就帶大家去會會這個虛析構函式
首先,先看一段**:
#incldue
using namespace std;
class base
//建構函式
~base()//析構函式 };
class derive : public base
~derive() };
int main()
很顯然,上面的程式輸出結果是:base destructor!!。
下面,畫個圖來說明一下
適合無虛函式的記憶體模型,有虛函式時應該再加上虛表指標。
從圖中大致可以得出:用基類指標指向派生類物件,此時正常指標可以訪問到的是基類自己的成員和虛函式。顯然這裡在執行語句delete p時,呼叫的是base類的析構函式,從而只是釋放了pb,而pd仍然在堆中(因為沒用呼叫派生類的析構函式),那麼就造成了記憶體洩露。
如果,將base類中的析構函式宣告為虛函式,即:virtual ~base(),此時無論派生類中的析構函式有沒有加關鍵字virtual,它都是虛函式。
那麼,到這裡,我們就清楚了。在delete p時,根據多型的虛表,它呼叫的是派生類的析構函式,即~derive(); 而派生類的析構函式會自動呼叫基類的析構函式。所以,會先釋放pd,再釋放pb,最後釋放p;這樣,動態申請的記憶體的記憶體就全部被釋放了。
小結:若乙個類有派生類,則應將這個類設計為多型類。若這個類中沒有要設計成多型的成員函式,則至少應該析構函式宣告為虛函式。
以上內容是雲主學習c++過程中的一些體會。畢竟能力有限,若有錯誤之處,還望指正: [email protected]
c 之虛析構函式
析構函式的作用是在物件撤銷之前做必要的 清理現場 的工作。當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情...
C 之虛析構函式
虛析構函式 如果乙個類有子類,則這個類 父類 的析構函式必須是虛函式 如果父類的析構函式不是虛函式,則當 delete 刪除乙個指向子類物件的父類指標 時,將呼叫父類版本的析構函式,子類只釋放了來自於父類的那部分成員變數,而子類自己擴充套件的成員變數沒有被釋放,造成記憶體洩漏 include std...
C 之虛析構函式
問題1 什麼時候要用虛析構函式?答案 通過基類的指標來刪除派生類的物件時,基類的析構函式應該是虛的。這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。原因 用物件指標來呼叫乙個函式,有以下兩種情況 如果是虛函式,會呼叫派生類中的版本 如果是非虛函式,會呼叫指標所指型別的...