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

C++深度探索虛函數(shù)指針示例

 更新時(shí)間:2022年12月19日 12:37:50   作者:Huuaaaaa  
虛函數(shù)主要通過V-Table虛函數(shù)表來實(shí)現(xiàn),該表主要包含一個(gè)類的虛函數(shù)的地址表,可解決繼承、覆蓋的問題,下面這篇文章主要給大家介紹了如何通過一篇文章帶你掌握C++虛函數(shù)的來龍去脈,需要的朋友可以參考下

代碼描述:定義一個(gè)Person類為基類,ChinesePer 類與EnglishPer類都繼承于此基類。

class Person
{
public:
	void speak() {
		cout << "說人話" << endl;
	}
private:
	int m_type = 1 ;
};
class ChinesePer :public Person {
public:
	void speak() {
		cout << "說中國(guó)話chinese..." << endl;
	}
};
class EnglishPer :public Person {
public:
	void speak() {
		cout << "說英國(guó)話english..." << endl;
	}
};

先看看此時(shí)各個(gè)類占用的內(nèi)存信息:

int main() {
	int person_size = sizeof(Person);
	int Chineseper_size = sizeof(ChinesePer);
	int Englishper = sizeof(EnglishPer);
}

可以看到三個(gè)類的大小都為4個(gè)字節(jié),占用的情況就是 類中的m_type變量。

將基類中的 speak() 函數(shù)加上virtual關(guān)鍵字 ,成為虛函數(shù)后再次查看內(nèi)存字節(jié)大小:

可以看到多出了4個(gè)字節(jié)大小的空間(X86),三個(gè)類的大小都為 8。其實(shí)就是多出了一個(gè)指針的大小,4個(gè)字節(jié) ,創(chuàng)建一個(gè)子類對(duì)象就可以明顯看出來:

可以得出結(jié)論一:繼承過來的成員變量 m_type(4個(gè)字節(jié)) + _vfptr(4個(gè)字節(jié)) = 8個(gè)字節(jié)。

繼續(xù)探索虛函數(shù)表的原理, 創(chuàng)建以下子類對(duì)象并通過父類指針指向子類對(duì)象調(diào)用speak函數(shù)發(fā)生多態(tài):

int main(){
	ChinesePer chs;
	ChinesePer chs2;
	EnglishPer eng;
    Person *ptr = &chs;		//父類指針指向子類對(duì)象
	Person *ptr1 = &chs2;
	Person *ptr2 = &eng;
	ptr->speak();
	ptr1->speak();
	ptr2->speak();
}

以上代碼執(zhí)行后會(huì)發(fā)生多態(tài):

此時(shí)我們看看三個(gè)對(duì)象的內(nèi)存分布:

用圖片簡(jiǎn)要描述一下就是:

在這里可以先得到結(jié)論二: 同一個(gè)子類的所有對(duì)象共享一個(gè)虛函數(shù)表,指向虛函數(shù)表的指針_vptr是相同的。

在內(nèi)存分布上查看一下 eng對(duì)象的虛函數(shù)指針地址情況:

可以看到該虛函數(shù)指針的地址上的值,存放的正是 該子類中的重寫函數(shù) speak()函數(shù)的地址。

如果把這個(gè)地址的值,修改為 Chineseper 類中的重寫函數(shù)speak() 的地址值,會(huì)發(fā)生什么?

手動(dòng)修改了eng對(duì)象中虛函數(shù)指針內(nèi)的地址值,將改值本來是存放的是 EnglishPer 類中的speak() 函數(shù)的地址,現(xiàn)在更改為 ChinesePer 類中speak() 函數(shù)的地址。

單步走發(fā)生多態(tài):

至此可以得出結(jié)論三:

當(dāng)基類函數(shù)加了virtual 關(guān)鍵字后,虛函數(shù)的調(diào)用方法是間接調(diào)用:先查虛函數(shù)表的地址(也就是指向虛函數(shù)表的指針 _vptr),再查虛函數(shù)表中的虛函數(shù)指針。

不妨在基類繼續(xù)添加兩個(gè)虛函數(shù)

class Person
{
public:
	virtual void speak() {
		cout << "說人話" << endl;
	}
	virtual void eat() {
		cout << "吃飯" << endl;
	}
	virtual void sleep() {
		cout << "睡覺" << endl;
	}
private:
	int m_type =1 ;
};

子類只重寫了speak函數(shù),查看一下chs對(duì)象的虛函數(shù)指針地址存放的值:

的確存放的還是各個(gè)函數(shù)的地址,且是連續(xù)存放的,因此在進(jìn)行查表調(diào)用虛函數(shù)的時(shí)候,也是每移動(dòng)4個(gè)字節(jié)指向的就是一個(gè)函數(shù)的指針地址。

可以簡(jiǎn)要描述一下形式就很直觀了:

總結(jié):

1.增加了virtual 關(guān)鍵字的對(duì)象頭部4個(gè)字節(jié)是一個(gè)指針,指向了虛函數(shù)表的地址(單繼承情況下)。

2.同一個(gè)子類的所有對(duì)象共享一個(gè)虛函數(shù)表,指向虛函數(shù)表的指針_vptr是相同的。

3.當(dāng)基類函數(shù)加了virtual 關(guān)鍵字后,虛函數(shù)的調(diào)用方法是間接調(diào)用:先查虛函數(shù)表的地址(也就是指向虛函數(shù)表的指針 _vptr),再查虛函數(shù)表中的虛函數(shù)指針。

到此這篇關(guān)于C++深度探索虛函數(shù)指針示例的文章就介紹到這了,更多相關(guān)C++虛函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ deque容器的用法詳解

    C++ deque容器的用法詳解

    在處理一些數(shù)組的事情,所以隨手保留一下Deque容器的使用方法很有必要,接下來通過本文給大家重點(diǎn)介紹C++ deque容器的用法及deque和vector的區(qū)別講解,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C語言實(shí)現(xiàn)電子英漢詞典系統(tǒng)

    C語言實(shí)現(xiàn)電子英漢詞典系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電子英漢詞典系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Linux下C語言修改進(jìn)程名稱的方法

    Linux下C語言修改進(jìn)程名稱的方法

    這篇文章主要介紹了Linux下C語言修改進(jìn)程名稱的方法,涉及Linux下使用C語言操作進(jìn)程的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • c語言描述回文數(shù)的三種算法

    c語言描述回文數(shù)的三種算法

    這篇文章主要介紹了c語言描述回文數(shù)的三種算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺析C語言中的setjmp與longjmp函數(shù)

    淺析C語言中的setjmp與longjmp函數(shù)

    以下是對(duì)C語言中的setjmp與longjmp函數(shù)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++中malloc與free、new與delete的詳解與應(yīng)用

    C++中malloc與free、new與delete的詳解與應(yīng)用

    今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Visual Studio2000系列版本安裝OpenGL的圖文教程

    Visual Studio2000系列版本安裝OpenGL的圖文教程

    這篇文章主要介紹了Visual Studio2000系列版本安裝OpenGL的圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C++讀入XML文件示例

    C++讀入XML文件示例

    本篇文章主要介紹了C++讀入XML文件,讀取和設(shè)置xml配置文件是最常用的操作,TinyXML是一個(gè)開源的解析XML的C++解析庫(kù),感興趣的小伙伴們可以參考一下。
    2016-12-12
  • C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例

    C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例

    這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C++實(shí)現(xiàn)將數(shù)據(jù)寫入Excel工作表的示例代碼

    C++實(shí)現(xiàn)將數(shù)據(jù)寫入Excel工作表的示例代碼

    直觀的界面、出色的計(jì)算功能和圖表工具,使Excel成為最流行的個(gè)人計(jì)算機(jī)數(shù)據(jù)處理軟件。在本文中,您將學(xué)習(xí)如何使用?Spire.XLS?for?C++?創(chuàng)建?Excel?文檔,以及如何將數(shù)據(jù)寫入?Excel?工作表
    2023-03-03

最新評(píng)論

当雄县| 凤翔县| 莱阳市| 井冈山市| 开平市| 苍南县| 富平县| 山东省| 南岸区| 那曲县| 息烽县| 枝江市| 安化县| 烟台市| 海盐县| 武川县| 大方县| 东阿县| 宝坻区| 新闻| 页游| 金平| 玛沁县| 贵定县| 汝阳县| 扬州市| 绥滨县| 托里县| 潢川县| 丰镇市| 和硕县| 烟台市| 德江县| 祁连县| 乐陵市| 高雄市| 滦南县| 仁化县| 鹤庆县| 阳曲县| 卫辉市|