溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中虛擬函數(shù)的內(nèi)存分配機(jī)制是什么

發(fā)布時(shí)間:2020-08-15 13:47:51 來(lái)源:億速云 閱讀:146 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI