實(shí)現(xiàn)多態(tài)必須滿足什么條件

3 虛函數(shù)機(jī)制 virtual mechanism
先看代碼:

class A
{
public:
 virtual void print() { cout<<"A.."<<endl; }
};
class B : public A
{
public:
 virtual void print() { cout<<"B.."<<endl; }
};
void test4()
{
    A a1; //base
    B  b1;//child 

   a1 = b1;//A::operator= 對象b1賦值給a2
    a1.print(); // prints A
    A& a2=b1;// 引用a2指向b1
    a2.print();//// prints B
}

實(shí)現(xiàn)條件:

To get polymorphic behavior in C++, the member functions called must be virtualand objects must be manipulated through pointers or references

Q:

  • 為什么使用派生類和基類對象之間直接賦值不能實(shí)現(xiàn)渐北?? 必須用用指針或者引用?
  • 為什么要用虛函數(shù)?

A:
為什么使用派生類和基類對象之間直接賦值不能實(shí)現(xiàn)?? 必須用用指針或者引用?

要實(shí)現(xiàn)多態(tài)殖卑,必須使用指針或者引用    因?yàn)槟J(rèn)的賦值運(yùn)算符并不會(huì)操作虛函數(shù)表

驗(yàn)證如下:[ Print C++ vtables using GDB]
1.1 vptr 理解成指針 因?yàn)椴恢纕ptr內(nèi)部結(jié)果 采用 gdb x查看變量值
因?yàn)榻o出代碼只提供一個(gè)函數(shù) 只需要打印4字節(jié)就可以了
(gdb) p sizeof(int) $10 = 4

1.2 打印 A a1; //base
(gdb) p a1

$11 = (A) { _vptr.A = 0x400e10 <vtable for A+16> }
(gdb) x/4x 0x400e10

0x400e10 <_ZTV1A+16>: 0x00400c9e 0x00000000 0x00004231 0x00000000
(gdb) x/4x 0x00400c9e

0x400c9e <A::print()>: 0xe5894855 0x10ec8348 0xf87d8948 0x400dd7be



父類A::_vptr.A 內(nèi)容是:
0x400c9e <A::print()>

1.3 打印 B b1;//child
執(zhí)行構(gòu)造函數(shù):A() -> B()
初始化_vptr
(gdb) p b1 $12 = (B) { = { _vptr.A = 0x400df0 <vtable for B+16> }, } (gdb) x/4x 0x400df0 0x400df0 <_ZTV1B+16>: 0x00400cc8 0x00000000 0x00000000 0x00000000 (gdb) x/4x 0x00400cc8 0x400cc8 <B::print()>: 0xe5894855 0x10ec8348 0xf87d8948 0x400ddbbe


這說明對象b1.vptr 記錄虛函數(shù)入口地址 0x400cc8 <B::print()>
只要a1.vptr 指向 b1.******** **vptr 即可 ******


1.4 a1=b1
調(diào)用 A::operator=

a1

a1 _vptr 沒有發(fā)生變化 不可以

是不是復(fù)制操作有問題這個(gè)別人已經(jīng)驗(yàn)證了 A& operator = (const B& b) { *(int )this=(int *)&b; return *this; }

依然沒有發(fā)生變化
1.5 A& a2=b1; 發(fā)生發(fā)生了什么變化
(gdb) p (B)a2 { = { _vptr.A = 0x400cc8 <B::print()> }, }
(gdb) x/4x 0x400cc8 0x400cc8 <B::print()>: 0xe5894855 0x10ec8348 0xf87d8948 0x400ddbbe

一句話解釋: 1.默認(rèn)的賦值運(yùn)算符并不會(huì)操作虛函數(shù)表例隆。 2.要實(shí)現(xiàn)多態(tài)埋泵,必須使用指針或者引用
為什么要用虛函數(shù)

如果不沒有聲明虛函數(shù) 同名函數(shù)出現(xiàn)覆蓋現(xiàn)象寂诱!
A& a2=b1;
假如 b1 [AAAA BBBB]
a2 [AAAA]
A& a2=b1; 對象賦值 只是a.成員=b.成員 其他的就發(fā)生強(qiáng)制轉(zhuǎn)換 結(jié)果 a2 [AAAA]
函數(shù)之間不會(huì)賦值的就需要一個(gè)記錄 函數(shù)入口地址

圖片可能和代碼不符 你應(yīng)該可以看懂 沒有虛函數(shù)的對象數(shù)據(jù)布局
成員類型相同:


成員類型相同

成員類型不同(對齊)

成員類型不同需 對齊

有虛函數(shù)的對象數(shù)據(jù)布局
有虛函數(shù)的對象數(shù)據(jù)布局

跟深入地方請查看《Inside the C++ Object Model》
我理解
數(shù)據(jù)部分:
對象在執(zhí)行賦值 ==操作時(shí)候,如果類型不同會(huì)發(fā)生強(qiáng)制轉(zhuǎn)換
因此需要相同成員
vptr比較特殊 不能像普通成員一樣訪問
只能通過指針來實(shí)現(xiàn)不同對象賦值
通過命令 gdb x 查看 我只聲明一個(gè)virtual 因此 n=4
如果有清楚麻煩留言告知蒋搜!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抒倚,一起剝皮案震驚了整個(gè)濱河市褐着,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌托呕,老刑警劉巖含蓉,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異项郊,居然都是意外死亡馅扣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門着降,熙熙樓的掌柜王于貴愁眉苦臉地迎上來差油,“玉大人,你說我怎么就攤上這事⌒罾” “怎么了发侵?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妆偏。 經(jīng)常有香客問我刃鳄,道長,這世上最難降的妖魔是什么钱骂? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任叔锐,我火速辦了婚禮,結(jié)果婚禮上见秽,老公的妹妹穿的比我還像新娘愉烙。我一直安慰自己,他們只是感情好解取,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布步责。 她就那樣靜靜地躺著,像睡著了一般肮蛹。 火紅的嫁衣襯著肌膚如雪勺择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天伦忠,我揣著相機(jī)與錄音,去河邊找鬼稿辙。 笑死昆码,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邻储。 我是一名探鬼主播赋咽,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吨娜!你這毒婦竟也來了脓匿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宦赠,失蹤者是張志新(化名)和其女友劉穎陪毡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾扭,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毡琉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妙色。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桅滋。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖身辨,靈堂內(nèi)的尸體忽然破棺而出丐谋,到底是詐尸還是另有隱情芍碧,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布号俐,位于F島的核電站泌豆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏萧落。R本人自食惡果不足惜践美,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望找岖。 院中可真熱鬧陨倡,春花似錦、人聲如沸许布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜜唾。三九已至杂曲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袁余,已是汗流浹背擎勘。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颖榜,地道東北人棚饵。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像掩完,于是被迫代替她去往敵國和親噪漾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容