簡述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
因?yàn)樘摂M函數(shù)的地址翻譯取決于對象的內(nèi)存地址,而不取決于數(shù)據(jù)類型(編譯器對函數(shù)
調(diào)用的合法性檢查取決于數(shù)據(jù)類型)。原來,如果類中定義了虛擬函數(shù),該類及其派生類
就要生成一張?zhí)摵瘮?shù)表,即vtable。而在類的對象地址空間中存儲一個(gè)該虛函數(shù)表的入口,
占4個(gè)字節(jié),這個(gè)入口地址是在構(gòu)造對象是由編譯器寫入的。
有如下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ī)制,由于對象的內(nèi)存空間中包含了虛函數(shù)表的入口,
編譯器能夠由這個(gè)入口找到適當(dāng)?shù)奶摵瘮?shù),這個(gè)函數(shù)的地址不再由數(shù)據(jù)類型決定了。
語句pMem = &b;使pMem指向?qū)ο骲的內(nèi)存空間,調(diào)用pMem->funOver()時(shí),
編譯器得到了對象b的vtable入口,并由這個(gè)入口找到了CMemSub::funOver()虛函數(shù)地址。到此,虛函數(shù)的秘密終于大白于天下了。虛函數(shù)是C++語法的重點(diǎn)和難點(diǎn)。
以上就是簡述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于c++虛擬函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例
這篇文章主要介紹了C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例解析,代理模式可以被歸類為結(jié)構(gòu)型的設(shè)計(jì)模式,代理模式主張為對象提供一種代理以控制對這個(gè)對象的訪問,需要的朋友可以參考下2016-03-03
字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進(jìn)行了比較,需要的朋友可以過來參考下2013-07-07
c語言實(shí)現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中
下面小編就為大家?guī)硪黄猚語言實(shí)現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
C++中用指向數(shù)組的指針作函數(shù)參數(shù)
多維數(shù)組名作為函數(shù)參數(shù)傳遞:在二維數(shù)組中,數(shù)組名a是指向首行a[0]的指針,也就是說a=&a[0]; a[0]是指向首元素a[0][0]的指針,也就是說a[0]=&a[0][0]2013-10-10

