1. 程式人生 > 實用技巧 >DEV匯出多個控制元件到excel

DEV匯出多個控制元件到excel

技術標籤: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()後,執行結果為:
在這裡插入圖片描述