您好,登錄后才能下訂單哦!
小編給大家分享一下C++中虛擬函數的內存分配機制是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
因為虛擬函數的地址翻譯取決于對象的內存地址,而不取決于數據類型(編譯器對函數
調用的合法性檢查取決于數據類型)。原來,如果類中定義了虛擬函數,該類及其派生類
就要生成一張虛函數表,即vtable。而在類的對象地址空間中存儲一個該虛函數表的入口,
占4個字節,這個入口地址是在構造對象是由編譯器寫入的。
有如下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; }
程序運行結果為:
1
2
這里涉及到虛函數的工作機制,由于對象的內存空間中包含了虛函數表的入口,
編譯器能夠由這個入口找到適當的虛函數,這個函數的地址不再由數據類型決定了。
語句pMem = &b;
使pMem指向對象b的內存空間,調用pMem->funOver()
時,
編譯器得到了對象b的vtable入口,并由這個入口找到了CMemSub::funOver()
虛函數地址。到此,虛函數的秘密終于大白于天下了。虛函數是C++語法的重點和難點。
看完了這篇文章,相信你對C++中虛擬函數的內存分配機制是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。