有繼承的C 析構函式一定要用virtual

2021-07-03 20:56:50 字數 853 閱讀 3445

先補下virtual是啥

虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。 

先貼個**,再解釋

#include using

namespace

std;

class

base

; ~base()

};class a : public

base

~a()

};class

base1

;

virtual ~base1()

};class a1 : public

base1

~a1()

};int

main()

/*base construct

a construct

base destroy

********************==

base1 construct

a1 construct

a1 destroy

base1 destroy

*/

在**尾部的注釋就是輸出。

base的析構函式沒有virtual

base1的析構函式有virtual

base* p = new a

delete p

這個過程只呼叫了base的析構函式,沒有呼叫a的析構函式。

這樣在實際應用中會有不確定的後果,可能會memory leak

應該在a的析構函式中我們可能會銷毀一些其他的資源,而這裡並未呼叫。

所以要給base的析構函式以virtual屬性。

繼承基類析構函式一定要加上virtual

繼承時,要養成的乙個好習慣就是,基類析構函式中,加上virtual,為什麼要加上呢?看下未加virtual的 執行結果 include stdafx.h include include include include include using namespace std class ctask c...

C 類有繼承時,析構函式必須為虛函式

虛函式與多型一文中講了虛函式的用法和要點,但少講了一點,就是虛函式在析構中的用法,本文就是修復一bug的。c 類有繼承時,析構函式必須為虛函式。如果不是虛函式,則使用時可能存在內在洩漏的問題。假設我們有這樣一種繼承關係 如果我們以這種方式建立物件 subclass pobj new subclass...

C 繼承中的建構函式和析構函式

1 繼承中建構函式和析構函式呼叫順序 a 呼叫父類建構函式 b 呼叫其他成員的建構函式 c 呼叫子類建構函式 d 析構呼叫順序相反。include using namespace std class base public base cout base中的預設構造函式呼叫 2 子類預設呼叫父類的預設...