繼承時,要養成的乙個好習慣就是,基類析構函式中,加上virtual,為什麼要加上呢?
看下未加virtual的**執行結果:
#include "stdafx.h"
#include #include #include #include #include using namespace std;
class ctask
~ctask()
virtual void process()
private:
};//
class cspecialtask : public ctask
~cspecialtask()
void process()
private:
int* m_task_no;
};
int main (int argc, char **argv)
輸出結果為:
specail task 1 is running。
~ctask() 析構函式前加上virtual關鍵字之後重新執行一遍,結果為:
specail task 1 is running。
release memory
從以上對比結果來看,就非常清楚為什麼一定要養成該好習慣了。防止繼承的父類記憶體沒有釋放。乙個良好的習慣可以規避很多難以發現的問題。
有繼承的C 析構函式一定要用virtual
先補下virtual是啥 虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。先貼個 再解釋 include using namespace std class base base class a public bas...
基類虛析構函式
why虛析構函式?主要還是由於基類指標或引用可以不進行顯示型別轉換的情況下指向派生類物件。同時通過引用或者指標或引用呼叫方法時遵循 例如 定義了基類brass,派生類brassplus 如果viewacct 不是虛方法,則b1 ref.viewacct 和b2 ref.viewacct 均是使用br...
基類虛析構函式分析
多型是由虛函式表來實現,通過父類指標來實現動態繫結。子類重寫父類的虛函式後,覆蓋虛函式表中父類該虛函式在表中原來的位置,也許 覆蓋 也就是由此得稱。那析構函式是否也如此呢?程式 中經常可以見到將基類的析構函式寫成虛函式,目的就是為了防止由以下這種情況造成的記憶體洩漏 class a class b ...