DEV匯出多個控制元件到excel
阿新 • • 發佈:2020-12-15
技術標籤:c++
為什麼解構函式必須是虛擬函式?為什麼 C++ 預設的解構函式不是虛擬函式。 虛擬函式 解構函式
背景:在多型使用的時候,父類的指標或引用指向子類物件,父類指標無法釋放子類的析構程式碼。(即:如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫子類的析構程式碼),從而造成記憶體洩露。
#include<iostream>
using namespace std;
#include<string>
class Father {
public:
Father() {
cout << "Father建構函式呼叫" << endl;
}
virtual void func1() = 0;
~Father() {
cout << "Father解構函式呼叫" << endl;
}
};
我們建一個基類Father,不加 virtual 時的常規情況。
class Son : public Father {
public:
Son(string name) {
cout << "Son建構函式呼叫" << endl;
m_Name = new string(name);
}
virtual void func1() {
cout << *m_Name << "兒子在吃肯德基" << endl;
}
~Son() {
cout << "Son解構函式呼叫" << endl;
if (this->m_Name != NULL) {
delete m_Name;
m_Name = NULL;
}
}
string* m_Name;
};
建一個子類繼承父類,主要是當子類在堆區開闢一個記憶體時,此時~Son解構函式將不會被執行。
void test () {
Father *f = new Son("李剛");
f->func1();
delete f;
}
int main() {
test();
system("pause");
return 0;
}
通過父類指標去釋放,會導致子類物件可能清理不乾淨,造成記憶體洩漏。
執行結果:
發現根本沒有Son解構函式的呼叫。
解決方法:虛析構或純虛析構
將上面第一個程式碼塊裡的~Father() 修改為 virtual ~Father()後,執行結果為: