国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++析構(gòu)函數(shù)后加上virtual的原因

2019-11-06 07:24:29
字體:
供稿:網(wǎng)友

C++析構(gòu)函數(shù)加上virtual是為了防止內(nèi)存泄漏。

用在C++實(shí)現(xiàn)多態(tài)的時(shí)候,其基類要加virtual。

原因跟動(dòng)態(tài)綁定有關(guān),大家都知道,多態(tài)是通過虛函數(shù)實(shí)現(xiàn)的,而虛函數(shù)又是通過動(dòng)態(tài)綁定實(shí)現(xiàn)的。

先舉個(gè)例子:

class Base{	public:	virtual void function()	{		cout<<"this is Base's function"<<endl;	}				virtual ~Base()	{		cout<<"this is Base's destroy"<<endl;	}};class Derived:public Base{	public:	void function()	{		cout<<"this is Derived's function"<<endl;	}		~Derived()	{		cout<<"this is Derived's destroy"<<endl;	}};int main(){	Base *ptr = new Derived();	ptr->function();	delete ptr;	return 0;}上面的代碼,我先寫了虛函數(shù)function,第31行就是動(dòng)態(tài)綁定,而33行delete刪除的是Base型基類指針,此指針是沒有派生類Derived的析構(gòu)函數(shù)的,所以如果不在基類的析構(gòu)函數(shù)加上virtual的話,就不能動(dòng)態(tài)綁定派生類的析構(gòu)函數(shù)(當(dāng)然析構(gòu)函數(shù)的動(dòng)態(tài)綁定你可以看出來跟一般函數(shù)的動(dòng)態(tài)綁定相比是特殊的,析構(gòu)函數(shù)的虛函數(shù)不用按照函數(shù)名來找對(duì)應(yīng)的的函數(shù))。一句話:基類的析構(gòu)函數(shù)加了virtual就可以動(dòng)態(tài)綁定派生類的析構(gòu)函數(shù),這樣的話,在執(zhí)行多態(tài)后刪除其對(duì)象,就可以在刪除對(duì)象的時(shí)候執(zhí)行派生類的析構(gòu)函數(shù)了(當(dāng)然執(zhí)行基類的析構(gòu)函數(shù)是一定會(huì)的)。否則不會(huì)執(zhí)行派生類的析構(gòu)函數(shù)。

代碼輸出結(jié)果:

this is Derived's function

this is Derived's destroy

this is Base's destroy

你可以嘗試一下把基類的析構(gòu)函數(shù)前的virtual刪掉(第9行),輸出結(jié)果將是:

this is Derived's function

this is Base's destroy

你可以觀察到,沒有執(zhí)行派生類的析構(gòu)函數(shù)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 青龙| 靖江市| 洪洞县| 望城县| 南安市| 济南市| 拜泉县| 霍城县| 鹤壁市| 秭归县| 深水埗区| 海盐县| 凤凰县| 乳山市| 莲花县| 聂拉木县| 东乌| 友谊县| 遵义市| 蚌埠市| 泽普县| 镇远县| 白山市| 昭通市| 镇平县| 元阳县| 秦皇岛市| 灵川县| 汶上县| 大田县| 汕尾市| 广州市| 佳木斯市| 秭归县| 富锦市| 萍乡市| 达日县| 宝山区| 偏关县| 丹阳市| 涞源县|