C 基類和派生類構造和析構函式的順序!

2021-08-19 17:20:13 字數 1295 閱讀 6400



在visual studio中,新建控制台工程,構造類如下:

#include

using namespace std;

class cbase

~cbase()

};class cderive :public cbase

~cderive()

};對應不同的指標進行 delete 操作,結果如下:

(i)int main(int argc, char* argv)

執行結果:

s:\computertech\vs2015\release>test.exe

cbase():constructor

cderive():constructor

cbase(): destructor

(ii)

int main(int argc, char* argv)

執行結果:

s:\computertech\vs2015\release>test.exe

cbase():constructor

cderive():constructor

cderive(): destructor

cbase(): destructor

(iii)

int main(int argc, char* argv)

執行結果:

s:\computertech\vs2015\release>test.exe

cbase():constructor

cderive():constructor

cbase(): destructor

(iv)

int main(int argc, char* argv)

執行結果:

s:\computertech\vs2015\release>test.exe

cbase():constructor

cderive():constructor

cderive(): destructor

cbase(): destructor

總結:由上面的實驗結果可以看出,當 new cderive() 時,會先執行基類的建構函式,然後再執行派生類的建構函式;

而當 delete pointer 時,編譯器只考慮 pointer 指標本身的型別而不關心 pointer 實際指向的型別,即:若 pointer 為基類指標,則只呼叫基類的析構函式(不管 pointer 實際指向的是基類還是派生類);若 pointer 是派生類指標,則先呼叫派生類的析構函式,再呼叫基類的析構函式,呼叫順序與呼叫建構函式的順序相反。

C 基類和派生類的析構函式

和建構函式類似,析構函式也不能被繼承。與建構函式不同的是,在派生類的析構函式中不用顯式地呼叫基類的析構函式,因為每個類只有乙個析構函式,編譯器知道如何選擇,無需程式設計師干涉。另外析構函式的執行順序和建構函式的執行順序也剛好相反 建立派生類物件時,建構函式的執行順序和繼承順序相同,即先執行基類建構函...

模板基類派生類的建構函式和析構函式

include stdafx.h template class a a t c a a a a a operator a a template class b public a b t c a c 非預設建構函式不會呼叫模板基類的非預設建構函式 b b b a b 拷貝建構函式將過載模板基類的拷貝建...

C 派生類的構造和析構函式

派生類的目的是為了發展,派生類繼承了積累的成員,實現了原有 的重用,這只是一部分 而 的擴充才是最主要的,只有通過新增新的成員,加入新的功能,類的派生才有實際意義。派生類的建構函式只負責對新增的成員進行初始化,對所有從基類 繼承來的成員,其初始化工作還是由基類的建構函式完成。同樣,對派生類物件的掃尾...