最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中為何推薦要把基類析構(gòu)函數(shù)設(shè)置成虛函數(shù)

 更新時(shí)間:2022年12月28日 09:24:40   作者:我的博爾赫斯  
這篇文章主要介紹了C++中為何推薦要把基類析構(gòu)函數(shù)設(shè)置成虛函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++何推薦要把基類析構(gòu)函數(shù)設(shè)置成虛函數(shù)

在C++中常聽老師講要把基類析構(gòu)函數(shù)聲明成虛函數(shù),這是因?yàn)橐乐故褂没愔羔樤谡{(diào)用派生類對(duì)象析構(gòu)函數(shù)時(shí),觸發(fā)靜態(tài)綁定,調(diào)用不到派生類的析構(gòu)函數(shù),導(dǎo)致內(nèi)存泄漏

//Base表示基類
//Derive表示派生類
Base* ptr = new Derive d;

在這里如果沒有把基類析構(gòu)函數(shù)聲明成虛函數(shù),那么就沒有構(gòu)成多態(tài),那么編譯器只會(huì)去調(diào)用Base的析構(gòu)函數(shù)而非Derive

C++中析構(gòu)函數(shù)為虛函數(shù)問題

1、析構(gòu)函數(shù)是否定義為虛函數(shù)的區(qū)別

(1)析構(gòu)函數(shù)定義為虛函數(shù)時(shí):基類指針可以指向派生類的對(duì)象(多態(tài)性),如果刪除該指針delete []p;就會(huì)調(diào)用該指針指向的派生類析構(gòu)函數(shù),而派生類的析構(gòu)函數(shù)又自動(dòng)調(diào)用基類的析構(gòu)函數(shù),這樣整個(gè)派生類的對(duì)象完全被釋放。

(2)析構(gòu)函數(shù)不定義為虛函數(shù)時(shí):編譯器實(shí)施靜態(tài)綁定,在刪除基類指針時(shí),只會(huì)調(diào)用基類的析構(gòu)函數(shù)而不調(diào)用派生類析構(gòu)函數(shù),這樣就會(huì)造成派生類對(duì)象析構(gòu)不完全。

下面看幾個(gè)例子

2、派生類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)不是虛函數(shù)

#include<iostream>
using namespace std;
class ClxBase{
public:
	ClxBase() {};
	~ClxBase() { cout << "Output from the destructor of class ClxBase!" << endl; };
 
	void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
 
class ClxDerived : public ClxBase{
public:
	ClxDerived() {};
	~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
 
	void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
int main(){
    ClxDerived *p = new ClxDerived;		// 派生類指針操作派生類對(duì)象
	p->DoSomething();
	delete p;
	system("pause");
	return 0;
}

注:派生類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)不是虛函數(shù),此時(shí)會(huì)先是否派生類的資源,再釋放基類的資源,這里資源就不會(huì)出現(xiàn)泄漏的情況。

3、基類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)不是虛函數(shù)

#include<iostream>
using namespace std;
class ClxBase{
public:
	ClxBase() {};
	~ClxBase() { cout << "Output from the destructor of class ClxBase!" << endl; };
 
	void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
 
class ClxDerived : public ClxBase{
public:
	ClxDerived() {};
	~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
 
	void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
int main(){
	ClxBase *p = new ClxDerived;		// 基類指針操作派生類對(duì)象
	p->DoSomething();
	delete p;
	system("pause");
	return 0;
}

注:基類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)不是虛函數(shù):此時(shí)只是釋放了基類的資源,而沒有調(diào)用派生類的析構(gòu)函數(shù)。調(diào)用dosomething()函數(shù)執(zhí)行的也是基類定義的函數(shù)。這樣的刪除只能夠刪除基類對(duì)象,而不能刪除子類對(duì)象,形成了刪除一半形象,造成內(nèi)存泄漏。

4、基類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)是虛函數(shù)

#include<iostream>
using namespace std;
class ClxBase{
public:
	ClxBase() {};
// 定義為虛函數(shù)
	virtual ~ClxBase() { cout << "Output from the destructor of class ClxBase!" << endl; };
 
	virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
 
class ClxDerived : public ClxBase{
public:
	ClxDerived() {};
	~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
 
	void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
int main(){
	ClxBase *p = new ClxDerived;		// 基類指針操作派生類對(duì)象
	p->DoSomething();
	delete p;
	system("pause");
	return 0;
}

注:基類指針操作派生類對(duì)象,基類析構(gòu)函數(shù)是虛函數(shù):此時(shí)釋放了派生類的資源,再調(diào)用基類的析構(gòu)函數(shù)。調(diào)用dosomething()函數(shù)執(zhí)行的也是派生類定義的函數(shù)。

在公有繼承中,基類對(duì)派生類及其對(duì)象的操作,只能影響到那些從基類繼承下來(lái)的成員。如果想要用基類對(duì)非繼承成員進(jìn)行操作,則要把基類的這個(gè)函數(shù)定義為虛函數(shù)。

析構(gòu)函數(shù)自然也應(yīng)該如此:如果它想析構(gòu)子類中的重新定義或新的成員及對(duì)象,當(dāng)然也應(yīng)該聲明為虛的。

5、基類析構(gòu)函數(shù)定義為虛函數(shù)的情況

如果不需要基類對(duì)派生類及對(duì)象進(jìn)行操作,則不能定義虛函數(shù),因?yàn)檫@樣會(huì)增加內(nèi)存開銷.當(dāng)類里面有定義虛函數(shù)的時(shí)候,編譯器會(huì)給類添加一個(gè)虛函數(shù)表,里面來(lái)存放虛函數(shù)指針,這樣就會(huì)增加類的存儲(chǔ)空間。所以,只有當(dāng)一個(gè)類被用來(lái)作為基類的時(shí)候,并且有使用到基類指針操作派生類的情況時(shí),才把析構(gòu)函數(shù)寫成虛函數(shù)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

通州市| 民勤县| 赤峰市| 河南省| 鄂托克前旗| 大兴区| 泰兴市| 英德市| 平昌县| 土默特左旗| 乐山市| 监利县| 新蔡县| 瑞丽市| 广河县| 房山区| 青海省| 平江县| 会东县| 信阳市| 昭苏县| 彰化县| 高陵县| 滁州市| 青阳县| 乌兰察布市| 保亭| 溆浦县| 宣化县| 乌鲁木齐市| 微博| 子长县| 尉氏县| 资中县| 贵港市| 阿荣旗| 辽宁省| 航空| 多伦县| 金川县| 合川市|