C virtual 析構函式

2021-04-21 07:25:43 字數 691 閱讀 2208

#include

using std::cout;

using std::endl;

class base;

class derived:public base;

void main ()

//執行結果

~d

~b //

解釋 沿著程式執行流程,從

main

函式進入

首先,執行語句

base *b=new derived();

結果是在堆中建立類

derived

的乙個物件,並且讓型別為

base *

的指標b

指向這個物件;

其次,執行語句

delete b;

執行結果是釋放

b指向物件的記憶體空間。按照

c++的

delete

操作符的語義,編譯器會呼叫指標

b「對應型別

」的物件的析構函式

,但是由於類

base

的析構函式宣告為虛函式,因此實現方式具有多型特徵

,因此執行時呼叫的析構函式是

derived::~derived()。

第三,子類的析構函式

derived::~derived()

內部會呼叫父類的析構函式。

c virtual 虛析構函式 資源釋放的討論

關於c virtual,析構函式的討論已經挺多了,參見 但是我在使用時卻恰恰發生了相反的事情,不是記憶體洩漏,而是記憶體重複刪除。這也是乙個需要深思的問題。我們還是以傳統的animal和dog為例。首先是基類 animal pragma once class animal 實現 include an...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...