第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

虛擬繼承如何解決“鉆石”(多重繼承)歧義?

虛擬繼承如何解決“鉆石”(多重繼承)歧義?

C++ C
慕姐8265434 2019-08-26 14:49:06
虛擬繼承如何解決“鉆石”(多重繼承)歧義?class A                     { public: void eat(){ cout<<"A";} }; class B: virtual public A   { public: void eat(){ cout<<"B";} }; class C: virtual public A   { public: void eat(){ cout<<"C";} }; class D: public         B,C { public: void eat(){ cout<<"D";} }; int main(){     A *a = new D();     a->eat(); } 我理解鉆石問(wèn)題,上面的代碼沒(méi)有那個(gè)問(wèn)題。虛擬繼承究竟是如何解決問(wèn)題的?我的理解: 當(dāng)我說(shuō)A *a = new D();,編譯器想要知道類型的對(duì)象是否D可以分配給類型的指針A,但它有兩個(gè)可以遵循的路徑,但不能自己決定。那么,虛擬繼承如何解決問(wèn)題(幫助編譯器做出決定)?
查看完整描述

3 回答

?
互換的青春

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

派生類的實(shí)例“包含”基類的實(shí)例,因此它們?cè)趦?nèi)存中看起來(lái)像這樣:

class A: [A fields]class B: [A fields | B fields]class C: [A fields | C fields]

因此,如果沒(méi)有虛擬繼承,D類的實(shí)例將如下所示:

class D: [A fields | B fields | A fields | C fields | D fields]
          '- derived from B -' '- derived from C -'

因此,請(qǐng)注意A數(shù)據(jù)的兩個(gè)“副本”。虛擬繼承意味著內(nèi)部派生類在運(yùn)行時(shí)設(shè)置了一個(gè)vtable指針,指向基類的數(shù)據(jù),因此B,C和D類的實(shí)例如下所示:

class B: [A fields | B fields]
          ^---------- pointer to Aclass C: [A fields | C fields]
          ^---------- pointer to Aclass D: [A fields | B fields | C fields | D fields]
          ^---------- pointer to B::A          ^--------------------- pointer to C::A


查看完整回答
反對(duì) 回復(fù) 2019-08-26
  • 3 回答
  • 0 關(guān)注
  • 514 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)