為什麼需要虛析構函式

2022-08-04 19:54:14 字數 1019 閱讀 6618

**這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。**

```

class clxbase

;virtual ~clxbase() {};

virtual void dosomething() ;

};class clxderived : public clxbase

;~clxderived() ;

void dosomething() ;

};```

```clxbase *ptest = new clxderived;

ptest->dosomething();

delete ptest;

```的輸出結果是:

```do something in class clxderived!

output from the destructor of class clxderived!

```這個很簡單,非常好理解。

但是,如果把類clxbase析構函式前的virtual去掉,那輸出結果就是下面的樣子了:

```do something in class clxderived!

```也就是說,類clxderived的析構函式根本沒有被呼叫!一般情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話就會造成記憶體洩漏。我想所有的c++程式設計師都知道這樣的危險性。當然,如果在析構函式中做了其他工作的話,那你的所有努力也都是白費力氣。

所以,文章開頭的那個問題的答案就是--

**這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。**

當然,並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式

為什麼要用虛析構函式

1 問題引出 為什麼要使用虛析構函式?class a 父親 int main 我們知道在delete p 中 delete 操作符,會呼叫物件的析構函式,但是這裡傳入的是父類物件指標,所以delete 此時並不知道應該呼叫哪個析構函式,保險起見則只呼叫父類的析構函式,也就是說如果沒有使用虛析構函式,...

為什麼基類的析構函式需要是虛函式?

先來看這句話 只有在通過基類指標 或引用 間接指向派生類子型別時多型性才會起作用。派生類的指標只呼叫自己的函式!基類指標的函式呼叫如果有virtual則根據多型性呼叫派生類的函式,如果沒有virtual則是正常呼叫基類的函式。根據這個結論,設想 如果出現用基類指標指向派生類的情況,那麼在銷毀這個指標...

C 析構函式為什麼要為虛函式

1.為什麼基類的析構函式是虛函式?在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。下面 網路 源位址 a.第一段 includeusing namespace std class clxbase clxbase void dosomething class clxd...