簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
因?yàn)樘摂M函數(shù)的地址翻譯取決于對(duì)象的內(nèi)存地址,而不取決于數(shù)據(jù)類型(編譯器對(duì)函數(shù)
調(diào)用的合法性檢查取決于數(shù)據(jù)類型)。原來(lái),如果類中定義了虛擬函數(shù),該類及其派生類
就要生成一張?zhí)摵瘮?shù)表,即vtable。而在類的對(duì)象地址空間中存儲(chǔ)一個(gè)該虛函數(shù)表的入口,
占4個(gè)字節(jié),這個(gè)入口地址是在構(gòu)造對(duì)象是由編譯器寫入的。
有如下C++程序:
//#include<stdio.h> #include<iostream> using namespace std; class CMem { public: CMem(){} public: int m_first; private: unsigned char m_second; public : void fun1(); virtual int funOver(){return 1;} }; class CMemSub : public CMem { public: CMemSub(){} public: int m_three; private: int m_four; public: void fun3(); virtual int funOver(){return 2;} virtual int fun4(){return 3;} }; int main() { CMem a,*pMem; CMemSub b; pMem = &a; printf("%d/n",pMem->funOver()); pMem = &b; printf("%d/n",pMem->funOver()); return 0; }
程序運(yùn)行結(jié)果為:
1
2
這里涉及到虛函數(shù)的工作機(jī)制,由于對(duì)象的內(nèi)存空間中包含了虛函數(shù)表的入口,
編譯器能夠由這個(gè)入口找到適當(dāng)?shù)奶摵瘮?shù),這個(gè)函數(shù)的地址不再由數(shù)據(jù)類型決定了。
語(yǔ)句pMem = &b;
使pMem指向?qū)ο骲的內(nèi)存空間,調(diào)用pMem->funOver()
時(shí),
編譯器得到了對(duì)象b的vtable入口,并由這個(gè)入口找到了CMemSub::funOver()
虛函數(shù)地址。到此,虛函數(shù)的秘密終于大白于天下了。虛函數(shù)是C++語(yǔ)法的重點(diǎn)和難點(diǎn)。
以上就是簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于c++虛擬函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VS2019實(shí)現(xiàn)C++的第一個(gè)MFC程序
本文主要介紹了VS2019實(shí)現(xiàn)C++的第一個(gè)MFC程序,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06C語(yǔ)言實(shí)現(xiàn)小學(xué)生計(jì)算機(jī)輔助教學(xué)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)小學(xué)生計(jì)算機(jī)輔助教學(xué)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03linux下基于C語(yǔ)言的信號(hào)編程實(shí)例
這篇文章主要介紹了linux下基于C語(yǔ)言的信號(hào)編程,實(shí)例分析了信號(hào)量的基本使用技巧與相關(guān)概念,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07