一分鐘教你真正搞明白C++多態(tài)

有那么多講C++多態(tài)的文章,但是卻沒有一個能真正看明白的,神秘的多態(tài)機制,究竟是如何實現的镣陕,看黃老師來如何教你?

我們先看兩個類:


class A

{

public:

A() { a = 111; }

virtual void? fun1()

{

cout << " A::fun1" << endl;

}

virtual void fun2()

{

cout << " A::fun2" << endl;

}

int a;

};

class? B:public A

{

public:

B() { b = 222; }

virtual void? fun2()

{

cout << " B::fun2" << endl;

}

virtual void fun3()

{

cout << " B::fun3" << endl;

}

int b;

};


簡單介紹下規(guī)則:

1. 首先對于含有virtual關鍵字的類(A? 或? B)姻政, 該類的所有對象的內存的前四個字節(jié)(32位系統(tǒng)下)呆抑,存放一個內存地址,根據這個地址可以訪問到該類的虛函數表內存(表中的每一項都是一個函數地址 汁展,所以A中有兩項? fun1? 鹊碍,fun2 )。

2. 派生類(自己有virtual 或者 基類中有 virtual 關鍵字)食绿,? 根據1規(guī)則侈咕,同樣有一張?zhí)摵瘮当韮却?( 表中的每一項都是一個函數地址,按道理來說應該是四項? ?A類中的 fun1? 器紧,fun2 耀销, B類中的fun2, fun3 铲汪,這個時候需要注意熊尉,派生類的fun2 會覆蓋基類的fun2, 所以只有三項)?

用圖解釋如下:


作為一個最喜歡扒內存的黃老師而言桥状,利用代碼測試其內存結構帽揪,便能一清二楚!8ㄕ濉转晰!

#include <iostream>?

using namespace std;

typedef? void(*PFUN)();

class? A

{

public:

A() { a = 111; }

virtual void? fun1()

{

cout << " A::fun1" << endl;

}

virtual void fun2()

{

cout << " A::fun2" << endl;

}

int a;

};

class? B:public A

{

public:

B() { b = 222; }

virtual void? fun2()

{

cout << " B::fun2" << endl;

}

virtual void fun3()

{

cout << " B::fun3" << endl;

}

int b;

};

int main()

{

//根據多態(tài)我們知道,肯定調用的是B的fun2

//A? *p = new B;

//p->fun2();

cout << "---------------------------A的虛函數表--------------------------" << endl;

{

cout << "A類的大小 " << sizeof(A) << endl;

//測試A的虛函數表

A? ? a;

int *pA = (int *)&a;//a內存空間的首地址

cout << "4字節(jié)vtable指針"<<endl;

int * vptr = (int *)(*pA); // a內存空間的 前4個字節(jié) 存放的內容是? 虛函數表的地址

PFUN? afun1 = (PFUN)vptr[0];

afun1();

PFUN? afun2 = (PFUN)vptr[1];

afun2();

cout <<"4字節(jié)a成員"<< *(pA + 1)<<endl;? //成員變量a的內容

}

cout << "---------------------------B的虛函數表--------------------------" << endl;?

{

cout << "B類的大小 " << sizeof(B) << endl;

//測試B的虛函數表

B? ? b;

int *pB = (int *)&b;//b內存空間的首地址

cout << "4字節(jié)vtable指針" << endl;? //成員變量a的內容

int * vptr = (int *)(*pB); // b內存空間的 前4個字節(jié) 存放的內容是? 虛函數表的地址

PFUN? bfun1 = (PFUN)vptr[0];

bfun1();

PFUN? bfun2 = (PFUN)vptr[1];

bfun2();

PFUN? bfun3 = (PFUN)vptr[2];

bfun3();

cout << "4字節(jié)a成員" << *(pB + 1) << endl;? //成員變量a的內容

cout << "4字節(jié)b成員" << *(pB + 2) << endl;? //成員變量b的內容

}

}

測試結果與示意圖一樣:

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末士飒,一起剝皮案震驚了整個濱河市查邢,隨后出現的幾起案子,更是在濱河造成了極大的恐慌酵幕,老刑警劉巖扰藕,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異芳撒,居然都是意外死亡邓深,警方通過查閱死者的電腦和手機未桥,發(fā)現死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥备,“玉大人冬耿,你說我怎么就攤上這事∶瓤牵” “怎么了亦镶?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袱瓮。 經常有香客問我缤骨,道長,這世上最難降的妖魔是什么尺借? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任绊起,我火速辦了婚禮,結果婚禮上褐望,老公的妹妹穿的比我還像新娘勒庄。我一直安慰自己,他們只是感情好瘫里,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布实蔽。 她就那樣靜靜地躺著,像睡著了一般谨读。 火紅的嫁衣襯著肌膚如雪局装。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天劳殖,我揣著相機與錄音铐尚,去河邊找鬼。 笑死哆姻,一個胖子當著我的面吹牛宣增,可吹牛的內容都是我干的。 我是一名探鬼主播矛缨,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼爹脾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕昭?” 一聲冷哼從身側響起灵妨,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎落竹,沒想到半個月后泌霍,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡述召,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年朱转,在試婚紗的時候發(fā)現自己被綠了蟹地。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡藤为,死狀恐怖锈津,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情凉蜂,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布性誉,位于F島的核電站窿吩,受9級特大地震影響,放射性物質發(fā)生泄漏错览。R本人自食惡果不足惜纫雁,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倾哺。 院中可真熱鬧轧邪,春花似錦、人聲如沸羞海。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽却邓。三九已至硕糊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腊徙,已是汗流浹背简十。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撬腾,地道東北人螟蝙。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓寺枉,卻偏偏與公主長得像肌索,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俗扇,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • 原創(chuàng):神秘編程神秘編程今天 問題拋出:為什么要使用多態(tài)饰潜?如果子類定義了與父類中原型相同的函數會發(fā)生什么初坠? 多態(tài):同...
    編程小兔崽閱讀 550評論 0 0
  • 基本概念 1a general-purpose programming language用于創(chuàng)建計算機程序。藝術類...
    伍帆閱讀 1,317評論 0 1
  • 容器 在實際的開發(fā)過程中半沽, 數據結構本身的重要性不會遜于操作于數據結構的算法的重要性爽柒, 當程序中存在著對時間要求很...
    編程小兔崽閱讀 1,084評論 0 1
  • 人說熱戀中的人既有了盔甲又有了軟肋!孩子出生后發(fā)現除了老公外又多了一條軟肋者填,孩子有個風吹草動就心疼浩村,看到孩子每次吃...
    若蘭素兮閱讀 1,331評論 0 3
  • 工作前要先學會做計劃,把計劃做細化占哟,做到傻子按部就班也會做心墅,這樣就能避免工作出錯出紕漏,效率也能提高榨乎!
    Tracy_zhang閱讀 229評論 0 0