青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chaosuper85

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

    多繼承與虛函數(shù)重復(fù)

    既然說到了多繼承,那么還有一個(gè)問題可能會(huì)需要解決,那就是如果兩個(gè)父類里都有相同的虛函數(shù)定義,在子對(duì)象的布局里會(huì)是怎么樣個(gè)情況?是否依然可以將這個(gè)虛函數(shù)指向到正確的實(shí)現(xiàn)代碼上呢?

    修改前面一個(gè)源代碼,在parent2的接口里增加下面的虛函數(shù)定義:

    virtual int fun1(){cout<<"parent2::fun1()"<<endl;return 0;};

    上面的fun1的定義與parent1類里的完全重復(fù)相同(類型,參數(shù)列表),增加上面的代碼后立即開始編譯,程序正常編譯通過。運(yùn)行之,得到下面的結(jié)果:

    child1::fun1()

    child1::fun2()

    這個(gè)程序居然正確的完成了執(zhí)行,編譯器在其中做了些怎樣的工作,是怎么樣避免掉隊(duì)fun1函數(shù)的沖突問題呢?

    讓我們來看看這個(gè)時(shí)候的child1的對(duì)象布局:
 class child1    size(8):
        +---
        | +--- (base class parent1)
 0      | | {vfptr}
        | +---
        | +--- (base class parent2)
 4      | | {vfptr}
        | +---
        +---

child1::$vftable@parent1@:
        | &child1_meta
        |  0
 0      | &child1::fun1

child1::$vftable@parent2@:
        | -4
 0      | &child1::fun2
 1      | &thunk: this-=4; goto child1::fun1

child1::fun1 this adjustor: 0
child1::fun2 this adjustor: 4

 


    恩~~~還是兩個(gè)vfptr在child1的對(duì)象布局里(不一樣就怪啦,呵呵),但是第二個(gè)vfptr所指的虛函數(shù)表的內(nèi)容有所變化哦!

    注意看紅色字體部分,虛函數(shù)表里并沒有直接填寫child::fun1的代碼,而是多了一個(gè) &thunk: this-=4;然后才goto child1::fun1!注意到一個(gè)關(guān)鍵名詞thunk了吧?沒錯(cuò),vc在這里使用了名為thunk的技術(shù),避免了虛函數(shù)fun1在兩個(gè)基類里重復(fù)出現(xiàn)導(dǎo)致的沖突問題!(除了thunk,還有其他方法可以解決此類問題的)。

    現(xiàn)在,我們知道為什么相同的虛函數(shù)不會(huì)在子類里出現(xiàn)沖突的情況了。

    但是,倘若我們?cè)诨惱锞褪怯蓛蓚€(gè)沖突的普通函數(shù),而不是虛函數(shù),是個(gè)怎樣的情況呢?

    多繼承產(chǎn)生的沖突與虛繼承,虛基類

    我們?cè)趐arent1和parent2里添加一個(gè)相同的函數(shù)void fun3(),然后再進(jìn)行編譯,通過了!查看類對(duì)象布局,跟上面的完全一致。但是在main函數(shù)里調(diào)用chobj.fun3()的時(shí)候,編譯器卻不再能正確編譯了,并且會(huì)提示“error C2385: 對(duì)”fun3“的訪問不明確”的錯(cuò)誤信息,沒錯(cuò),編譯器不知道你要訪問哪個(gè)fun3了。

    如何解決這樣的多繼承帶來的問題呢,其實(shí)有一個(gè)簡單的做法。就是在方法前限定引用的具體是哪個(gè)類的函數(shù),比如:chobj.parent1::fun3();  ,這樣的寫法就寫明了是要調(diào)用chobj的父類parent1里的fun3()函數(shù)!

    我們?cè)倏纯戳硗庖环N情況,從parent1和parent2里抹去剛才添加的fun3函數(shù),將之放到一個(gè)共同的基類里:
     class commonbase

    {

    public:

    void fun3(){cout<<"commonbase::fun3()"<<endl;}

    };
 


    而parent1和parent2都修改為從此類繼承。可以看到,在這個(gè)情況下,依然需要使用chobj.parent1::fun3();  的方式才可以正確調(diào)用到fun3,難道,在這種情況下,就不能自然的使用chobj.fun3()這樣的方式了嗎?

    虛繼承可以解決這個(gè)問題——我們?cè)趐arent1和parent2繼承common類的地方添加上一個(gè)關(guān)鍵詞virtual,如下:
     class parent1:virtual public commonbase

    {

    public:

    virtual int fun1(){cout<<"parent1::fun1()"<<endl;return 0;};

    };
 


    給parent2也同樣的處理,然后再次編譯,這次chobj.fun3()可以編譯通過了!!!

    編譯器這次又在私下里做了哪些工作了呢????
 class child1    size(16):
        +---
        | +--- (base class parent1)
 0      | | {vfptr}
 4      | | {vbptr}
        | +---
        | +--- (base class parent2)
 8      | | {vfptr}
12      | | {vbptr}
        | +---
        +---
        +--- (virtual base commonbase)
        +---

child1::$vftable@parent1@:
        | &child1_meta
        |  0
 0      | &child1::fun1

child1::$vftable@parent2@:
        | -8
 0      | &child1::fun2
 1      | &thunk: this-=8; goto child1::fun1

child1::$vbtable@parent1@:
 0      | -4
 1      | 12 (child1d(parent1+4)commonbase)

child1::$vbtable@parent2@:
 0      | -4
 1      | 4 (child1d(parent2+4)commonbase)

child1::fun1 this adjustor: 0
child1::fun2 this adjustor: 8

vbi:       class  offset o.vbptr  o.vbte fVtorDisp
      commonbase      16       4       4 0

 


    這次變化可大了去了!!!

    首先,可以看到兩個(gè)類parent1和parent2的對(duì)象布局里,都多了一個(gè)vbptr的指針。而在child1的對(duì)象布局里,還有一個(gè)virtual base commonbase的虛擬基類。再看看兩個(gè)vbptr的內(nèi)容:

    12 (child1d(parent1+4)commonbase) 這個(gè)很好理解,從parent1的vbptr開始,偏移12個(gè)字節(jié),指向的是virtual base commonbase!

    再看看4 (child1d(parent2+4)commonbase) ,從parent2的vbptr開始,便宜4個(gè)字節(jié),也指向了virtual base commonbase!

    這下明白了。虛基類在child1里只有一個(gè)共同的對(duì)象布局了,所以就可以直接用chobj.fun3()啦,當(dāng)然,在commonbase里的其他成員變量此時(shí)也可以同樣的方式訪問了!

    雖然解決方案有了,但是在一個(gè)系統(tǒng)的設(shè)計(jì)里,如果有一個(gè)基類出現(xiàn)多繼承沖突的情況,大部分情況下都說明這樣的設(shè)計(jì)是有問題的,應(yīng)該盡量避免這樣的設(shè)計(jì),并且盡量用純虛函數(shù),來提取一些抽象的接口類,把共同的方法接口都抽取出來,通常就能避免多繼承的問題。

 

posted on 2009-08-05 17:46 chaosuper 閱讀(152) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品久久91精品| 免费成人黄色av| 狂野欧美激情性xxxx欧美| 亚洲天堂av高清| 免费不卡在线观看av| 午夜日韩福利| 国产精品成人一区二区三区吃奶 | 日韩视频在线一区二区| 一区二区在线观看av| 亚洲综合国产激情另类一区| 亚洲精品网站在线播放gif| 久久不射中文字幕| 欧美在线高清| 国产精品永久入口久久久| 99re热这里只有精品视频| 亚洲人线精品午夜| 美腿丝袜亚洲色图| 欧美1区视频| 亚洲大胆人体在线| 久久综合国产精品| 麻豆成人综合网| 欲香欲色天天天综合和网| 久久久久亚洲综合| 久久婷婷成人综合色| 国产伦一区二区三区色一情| 亚洲一区国产| 新狼窝色av性久久久久久| 国产精品一卡二| 欧美亚洲免费电影| 狼人天天伊人久久| 国模吧视频一区| 久久久久久尹人网香蕉| 欧美ed2k| 日韩一级片网址| 欧美日韩一区二区三区在线观看免 | 日韩视频在线免费| 欧美成人免费全部观看天天性色| 欧美成人a视频| 亚洲乱码国产乱码精品精 | 国产精品va| 亚洲愉拍自拍另类高清精品| 久久福利一区| 亚洲高清精品中出| 欧美风情在线观看| 99在线观看免费视频精品观看| 一区二区三区视频在线观看| 国产精品久久久久久久久免费| 亚洲字幕一区二区| 欧美不卡高清| 亚洲视频国产视频| 国产亚洲成精品久久| 久久综合亚洲社区| 一本久久精品一区二区| 欧美一区三区二区在线观看| 激情自拍一区| 欧美精品在线观看播放| 亚洲视频你懂的| 狂野欧美激情性xxxx| 一本久久精品一区二区| 国产精品美女久久| 久久在线观看视频| 9i看片成人免费高清| 久久精品一区| 99re6热在线精品视频播放速度| 国产精品美女久久久浪潮软件 | 久久精品五月| 亚洲精品小视频| 久久久久久久久综合| 99xxxx成人网| 国产区亚洲区欧美区| 免费不卡中文字幕视频| 先锋a资源在线看亚洲| 91久久精品一区| 久久gogo国模裸体人体| 亚洲精品无人区| 尤物九九久久国产精品的特点| 欧美日韩在线亚洲一区蜜芽| 久久九九99| 亚洲自拍偷拍一区| 最新成人在线| 欧美大学生性色视频| 久久精品久久综合| 这里只有视频精品| 91久久精品www人人做人人爽| 国产精品入口尤物| 欧美日韩精品免费观看视频| 久久久成人精品| 欧美亚洲一级| 亚洲欧美成人一区二区在线电影| 亚洲国产综合视频在线观看| 久久久噜噜噜久久中文字幕色伊伊| 日韩视频在线一区二区| 亚洲成人中文| 国产主播喷水一区二区| 国产精品久久久久久久久久妞妞| 欧美激情中文字幕一区二区| 麻豆精品在线播放| 久久视频免费观看| 久久精品一区| 久久精品视频在线| 夜夜嗨av一区二区三区免费区| 日韩亚洲欧美在线观看| 极品少妇一区二区三区精品视频| 国产精品视频免费一区| 欧美日韩午夜激情| 欧美日韩直播| 久久这里有精品15一区二区三区| 国产一区二区成人久久免费影院| 欧美成人xxx| 国产精品99久久久久久白浆小说| 久久在线免费观看视频| 在线午夜精品自拍| 国产一在线精品一区在线观看| 欧美成年人视频网站欧美| 午夜一区二区三区在线观看| 亚洲电影自拍| 久久人人97超碰精品888 | 欧美日韩视频在线一区二区 | 亚洲欧美日韩高清| 亚洲第一主播视频| 久久精品国产v日韩v亚洲| 亚洲视频精品| 亚洲欧洲精品一区二区三区| 国产亚洲精品一区二555| 欧美日韩在线一区二区| 免费久久99精品国产自| 久久精品国产99精品国产亚洲性色| 妖精视频成人观看www| 欧美高清视频一二三区| 久久综合激情| 久久久国产亚洲精品| 午夜久久福利| 亚洲欧美国产视频| 亚洲午夜电影网| 一本久久综合亚洲鲁鲁五月天| 亚洲二区免费| 亚洲成色777777女色窝| 狠狠色丁香婷综合久久| 国产麻豆精品视频| 国产精品拍天天在线| 欧美日韩一区二区在线播放| 欧美精品一区二区三区蜜臀| 欧美激情性爽国产精品17p| 久久亚洲图片| 久热精品视频在线| 久久综合精品国产一区二区三区| 久久国产加勒比精品无码| 欧美在线视频在线播放完整版免费观看| 亚洲午夜一区二区三区| 一本色道久久综合亚洲精品高清 | 91久久国产精品91久久性色| 欧美大学生性色视频| 欧美成人综合在线| 欧美成年人视频| 美国成人毛片| 卡通动漫国产精品| 亚洲高清视频一区| 亚洲国产另类精品专区| 亚洲国产色一区| 亚洲伦理自拍| 亚洲综合欧美| 久久蜜桃精品| 欧美精品久久99久久在免费线| 欧美日韩中文在线| 国产精品影片在线观看| 国产女人水真多18毛片18精品视频| 国产精品久久久久影院色老大 | 亚洲精品久久久久久久久| 亚洲免费观看高清完整版在线观看熊| 日韩图片一区| 亚洲欧美日韩直播| 麻豆久久婷婷| 亚洲欧洲免费视频| 亚洲自拍偷拍麻豆| 久久影院亚洲| 国产精品国产三级国产普通话三级| 国产日韩精品在线| 亚洲激情av| 欧美在线视屏| 亚洲高清自拍| 亚洲欧美日韩直播| 欧美va天堂| 国产日韩精品一区二区三区| 悠悠资源网亚洲青| 亚洲免费在线电影| 久久综合九色综合欧美就去吻 | 销魂美女一区二区三区视频在线| 久久久久久香蕉网| 一区二区激情小说| 久久久久在线| 国产精品乱人伦中文| 亚洲欧洲久久| 久久免费高清| 亚洲色诱最新| 欧美精品色一区二区三区| 黑人操亚洲美女惩罚| 亚洲综合国产| 亚洲精品久久久久久下一站 | 久久高清国产| 国产精品久久久久久久久搜平片 |