您好,登錄后才能下訂單哦!
小編給大家分享一下C++中虛擬函數(shù)的內(nèi)存分配機(jī)制是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
因?yàn)樘摂M函數(shù)的地址翻譯取決于對(duì)象的內(nèi)存地址,而不取決于數(shù)據(jù)類(lèi)型(編譯器對(duì)函數(shù)
調(diào)用的合法性檢查取決于數(shù)據(jù)類(lèi)型)。原來(lái),如果類(lèi)中定義了虛擬函數(shù),該類(lèi)及其派生類(lèi)
就要生成一張?zhí)摵瘮?shù)表,即vtable。而在類(lèi)的對(duì)象地址空間中存儲(chǔ)一個(gè)該虛函數(shù)表的入口,
占4個(gè)字節(jié),這個(gè)入口地址是在構(gòu)造對(duì)象是由編譯器寫(xiě)入的。
有如下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ù)類(lèi)型決定了。
語(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)。
看完了這篇文章,相信你對(duì)C++中虛擬函數(shù)的內(nèi)存分配機(jī)制是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。