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

C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn)

 更新時間:2023年09月06日 08:55:03   作者:Love coldplay  
本文主要介紹了C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

虛析構(gòu)和純虛析構(gòu)

多態(tài)使用時,如果子類中有屬性開辟到堆區(qū),那么父類指針在釋放時無法調(diào)用子類的析構(gòu)代碼注釋:父類指針在釋放時,只會調(diào)用父類自己的析構(gòu)函數(shù),而無法調(diào)用子類的析構(gòu)函數(shù)

解決方式:將父類的析構(gòu)函數(shù)改為虛析構(gòu)或者純虛析構(gòu)

虛析構(gòu)和純虛析構(gòu)共性:

  • 可以解決父類指針釋放子類對象
  • 都需要有具體的函數(shù)實現(xiàn)

虛析構(gòu)和純虛析構(gòu)區(qū)區(qū)別:

如果是純虛析構(gòu),則該類屬于抽象類,無法實例化對象

為什么需要虛析構(gòu)

#include<iostream>
#include<string>
using namespace std;
//虛析構(gòu)和純虛析構(gòu)
class Animal
{
public:
	Animal()
	{
		cout << "調(diào)用了父類的構(gòu)造函數(shù)" << endl;	
	}
	~ Animal()
	{
		cout << "調(diào)用了父類的析構(gòu)函數(shù)" << endl;
	}
	virtual void speak() = 0;//純虛函數(shù)
};
class Cat :public Animal
{
public:
	string *m_Name;
	//在子類的構(gòu)造函數(shù),加入小貓的姓名
	Cat(string name)
	{
		cout << "調(diào)用了子類-小貓類的構(gòu)造函數(shù)" << endl;
		m_Name = new string(name);//在堆區(qū)創(chuàng)建
	}
	~Cat()
	{
		if (m_Name != NULL)
		{
			delete m_Name;
			m_Name = NULL;
			cout<<"調(diào)用了子類-小貓類的析構(gòu)函數(shù)"<<endl;
		}
	}
	virtual void speak()
	{
		cout << *m_Name<<"小貓在說話" << endl;//解引用
	}
};
void testSpeak()
{
	Animal *animal = new Cat("Tom");//有參構(gòu)造函數(shù)
	animal->speak();
	delete animal;
}
int main()
{
	testSpeak();
}

結(jié)果:

沒有調(diào)用子類的構(gòu)造函數(shù)

原因:是因為我們用父類指針指向了子類對象,所以釋放父類指針時,并不會調(diào)用子類的析構(gòu)代碼

父類指針在析構(gòu)時候 不會調(diào)用子類中析構(gòu)函數(shù),導(dǎo)致子類如果有堆區(qū)屬性,出現(xiàn)內(nèi)存泄漏

解決辦法:

在父類析構(gòu)函數(shù)前加入關(guān)鍵字 virtual

//虛析構(gòu)和純虛析構(gòu)
class Animal
{
public:
	Animal()
	{
		cout << "調(diào)用了父類的構(gòu)造函數(shù)" << endl;	
	}
	virtual ~ Animal()
	{
		cout << "調(diào)用了父類的析構(gòu)函數(shù)" << endl;
	}
	virtual void speak() = 0;//純虛函數(shù)
};

虛析構(gòu)函數(shù)用途

可以利用虛析構(gòu)函數(shù)解決父類指針在釋放子類問題時,內(nèi)存存在泄露的問題

純虛析構(gòu)

純虛析構(gòu)既要聲明也需要實現(xiàn)

  • 類內(nèi)聲明
  • 類外定義實現(xiàn)

有了純虛析構(gòu) 之后 ,這個類也屬于抽象類,無法實例化對象

屬性開辟到了堆區(qū)

//虛析構(gòu)和純虛析構(gòu)
class Animal
{
public:
	Animal()
	{
		cout << "調(diào)用了父類的構(gòu)造函數(shù)" << endl;	
	}
	//virtual ~ Animal()
	//{
	//	cout << "調(diào)用了父類的析構(gòu)函數(shù)" << endl;
	//}
	virtual ~Animal() = 0;//純虛析構(gòu)
	virtual void speak() = 0;//純虛函數(shù)
};
Animal::~Animal()
{
	cout << "調(diào)用了父類的純虛析構(gòu)函數(shù)" << endl;
}

結(jié)果

總結(jié):

  • 虛析構(gòu)或純虛析構(gòu)就是用來解決通過父類指針釋放子類對象
  • 如果子類中沒有堆區(qū)數(shù)據(jù),可以不寫為虛析構(gòu)或純虛析構(gòu)
  • 擁有純虛析構(gòu)函數(shù)的類也屬于抽象類

到此這篇關(guān)于C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++多態(tài)虛析構(gòu)和純虛析構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++與namespace有關(guān)的兩個編譯錯誤的講解

    C++與namespace有關(guān)的兩個編譯錯誤的講解

    今天小編就為大家分享一篇關(guān)于C++與namespace有關(guān)的兩個編譯錯誤的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 新手socket編程入門詳解指南

    新手socket編程入門詳解指南

    本文,將一步一步引導(dǎo)初學(xué)者來學(xué)習(xí)socket,所有編程思路都結(jié)合在socket API里面,以及提供socket的疑問和基礎(chǔ)知識點,同時在最后給出多個例程,下面可以和小編一起學(xué)習(xí)
    2019-05-05
  • C++學(xué)習(xí)進(jìn)階篇之類大小計算和this指針

    C++學(xué)習(xí)進(jìn)階篇之類大小計算和this指針

    this是C++中的一個關(guān)鍵字,也是一個const指針,它指向當(dāng)前對象,通過它可以訪問當(dāng)前對象的所有成員,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階篇之類大小計算和this指針的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識

    深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識

    這篇文章主要介紹了深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識,包括類型轉(zhuǎn)換運(yùn)算符函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-09-09
  • 解析四方定理的應(yīng)用

    解析四方定理的應(yīng)用

    所有自然數(shù)至多只要用四個數(shù)的平方和就可以表示
    2013-05-05
  • 解析C語言結(jié)構(gòu)體及位段

    解析C語言結(jié)構(gòu)體及位段

    今天小編就為大家分享一篇關(guān)于解析C語言結(jié)構(gòu)體及位段,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • OpenMP task construct 實現(xiàn)原理及源碼示例解析

    OpenMP task construct 實現(xiàn)原理及源碼示例解析

    這篇文章主要為大家介紹了OpenMP task construct 實現(xiàn)原理及源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解C/C++內(nèi)存區(qū)域劃分(簡而易懂)

    詳解C/C++內(nèi)存區(qū)域劃分(簡而易懂)

    C/C++中,內(nèi)存主要分為、堆、棧、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。本文重點給大家介紹C/C++內(nèi)存區(qū)域劃分的相關(guān)知識,需要的朋友參考下吧
    2021-06-06
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個 C/C++ 語言的頭文件,主要用于字符串處理,特別是在處理文件路徑時,它提供了一些函數(shù)來幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • 舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式

    舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式

    這篇文章主要介紹了舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式,先序中序后序二叉樹遍歷幾乎成了最老生常談的數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識,的朋友可以參考下
    2016-04-04

最新評論

榆中县| 安义县| 肥东县| 山西省| 鄂伦春自治旗| 新疆| 三原县| 临清市| 天柱县| 慈溪市| 阿图什市| 土默特右旗| 金平| 安陆市| 丰镇市| 永春县| 韶山市| 砚山县| 馆陶县| 个旧市| 本溪| 天峨县| 青川县| 嘉兴市| 屏东市| 洛南县| 沛县| 新化县| 临猗县| 绍兴市| 阳西县| 九龙坡区| 东至县| 永德县| 南和县| 岚皋县| 临安市| 昌黎县| 宣汉县| 迁西县| 宜良县|