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

chaosuper85

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

    多繼承與虛函數重復

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

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

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

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

    child1::fun1()

    child1::fun2()

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

    讓我們來看看這個時候的child1的對象布局:
 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

 


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

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

    現在,我們知道為什么相同的虛函數不會在子類里出現沖突的情況了。

    但是,倘若我們在基類里就是由兩個沖突的普通函數,而不是虛函數,是個怎樣的情況呢?

    多繼承產生的沖突與虛繼承,虛基類

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

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

    我們再看看另外一種情況,從parent1和parent2里抹去剛才添加的fun3函數,將之放到一個共同的基類里:
     class commonbase

    {

    public:

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

    };
 


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

    虛繼承可以解決這個問題——我們在parent1和parent2繼承common類的地方添加上一個關鍵詞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

 


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

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

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

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

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

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

 

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            久久久一二三| 亚洲精品视频啊美女在线直播| 性亚洲最疯狂xxxx高清| 欧美一区二区三区在线视频| 久久亚洲私人国产精品va媚药| 欧美高清视频在线 | 欧美日韩另类丝袜其他| 国产伦精品一区二区三区免费迷| 在线不卡欧美| 亚洲亚洲精品在线观看| 免费在线视频一区| 亚洲无限av看| 欧美精品www在线观看| 国产精品视频最多的网站| 1000部精品久久久久久久久| 亚洲欧美一区二区三区在线 | 亚洲黄色高清| 久久电影一区| 亚洲免费久久| 欧美 日韩 国产一区二区在线视频 | 欧美大片91| 午夜精品在线看| 欧美日韩国产不卡在线看| 精久久久久久| 欧美与欧洲交xxxx免费观看| 亚洲啪啪91| 亚洲一区在线观看视频| 欧美jizz19hd性欧美| 国产在线播放一区二区三区| 亚洲欧美日韩国产| 日韩网站在线| 欧美日韩的一区二区| 亚洲国产一区二区三区青草影视| 久久超碰97中文字幕| 一区二区高清在线观看| 欧美大片国产精品| 亚洲经典三级| 美女视频黄 久久| 西西裸体人体做爰大胆久久久| 欧美三区在线视频| 一区二区三区国产| 99ri日韩精品视频| 欧美国产三级| 在线综合亚洲欧美在线视频| 亚洲电影在线| 欧美国产激情二区三区| 亚洲国产一区二区三区青草影视| 欧美xart系列在线观看| 久久伊人亚洲| 亚洲国产精品v| 亚洲承认在线| 久久精品91久久久久久再现| 亚洲小说春色综合另类电影| 国产精品视频自拍| 久久国产福利国产秒拍| 亚洲欧美不卡| 国内外成人免费激情在线视频网站 | 国产女人精品视频| 久久狠狠亚洲综合| 久久久综合激的五月天| 亚洲精品女av网站| 亚洲免费久久| 国产一级一区二区| 欧美成人69av| 欧美激情在线| 久久国产高清| 美女视频网站黄色亚洲| 99re视频这里只有精品| 日韩午夜剧场| 国产亚洲欧洲997久久综合| 久久野战av| 欧美精品激情blacked18| 亚洲欧美在线网| 久久久久综合一区二区三区| 亚洲人成网站精品片在线观看| 亚洲激情成人在线| 国产精品美腿一区在线看| 久久久精品五月天| 欧美精品日韩三级| 欧美在线播放一区| 免费久久99精品国产| 亚洲在线一区| 另类亚洲自拍| 久久精品91| 欧美日韩国产免费| 久久久亚洲综合| 欧美日韩视频第一区| 美女主播一区| 国产精品国产三级国产aⅴ9色| 久久一区欧美| 国产九色精品成人porny| 欧美激情视频一区二区三区免费 | 欧美一级二级三级蜜桃| 亚洲精品中文在线| 欧美在线高清视频| 亚洲欧美国产精品va在线观看 | 亚洲视频精选在线| 亚洲国产欧美一区二区三区丁香婷| 在线亚洲观看| 亚洲毛片在线观看| 久久综合九九| 麻豆91精品91久久久的内涵| 国产精品成人在线观看| 欧美激情一区二区三区在线视频观看 | 国产精品丝袜xxxxxxx| 亚洲精品麻豆| 亚洲精品乱码久久久久久黑人| 久久激情综合| 欧美一区二区在线播放| 欧美午夜电影网| 日韩天堂在线视频| 一区二区激情小说| 麻豆精品精华液| 免费人成网站在线观看欧美高清| 国产精品中文字幕欧美| 亚洲一级网站| 亚洲小说春色综合另类电影| 美女精品一区| 欧美激情第9页| 亚洲欧洲一区二区天堂久久| 久久一区二区精品| 欧美激情久久久久久| 亚洲国产综合在线看不卡| 久久久午夜视频| 欧美国产激情二区三区| 亚洲经典三级| 欧美日韩福利视频| 在线视频日韩精品| 欧美一区二区三区免费观看视频 | 欧美日韩一区在线观看视频| 亚洲日本va午夜在线电影| 亚洲精品日本| 欧美日韩在线免费观看| 宅男噜噜噜66一区二区| 亚洲伊人伊色伊影伊综合网| 国产精品剧情在线亚洲| 午夜在线视频观看日韩17c| 久久久久久久综合色一本| 亚洲福利国产| 欧美日韩第一区日日骚| 亚洲在线一区二区三区| 久久精品日韩一区二区三区| 尤物精品国产第一福利三区| 欧美福利视频| 亚洲性色视频| 可以看av的网站久久看| 91久久久一线二线三线品牌| 欧美日韩久久不卡| 午夜伦理片一区| 欧美成人在线网站| 夜夜嗨av一区二区三区四季av| 欧美日韩精品三区| 久久av在线| 亚洲国产三级网| 性欧美大战久久久久久久久| 韩曰欧美视频免费观看| 欧美片在线观看| 久久精品国产亚洲精品| 亚洲日本va午夜在线影院| 欧美亚洲一级片| 亚洲三级国产| 国产精品一级久久久| 欧美大片一区| 香蕉成人伊视频在线观看| 亚洲国产精品免费| 久久精品最新地址| 亚洲午夜电影在线观看| 精品动漫3d一区二区三区免费| 欧美日本高清一区| 久久嫩草精品久久久久| 亚洲特级毛片| 亚洲欧洲精品一区二区三区| 久久激情久久| 亚洲图片欧美午夜| 91久久精品网| 在线成人性视频| 国产欧美一区二区三区另类精品| 欧美激情视频在线免费观看 欧美视频免费一| 在线亚洲一区二区| 91久久精品国产91性色tv| 久久久午夜电影| 欧美主播一区二区三区美女 久久精品人 | 蜜乳av另类精品一区二区| 午夜在线精品| 亚洲自拍偷拍一区| 日韩视频免费在线| 91久久在线播放| 欧美福利视频在线观看| 久久蜜桃香蕉精品一区二区三区| 亚洲一区二区三区四区中文| 亚洲免费观看高清完整版在线观看熊 | 午夜激情久久久| 一本一本久久a久久精品综合妖精| 伊人久久大香线蕉综合热线 | 欧美v日韩v国产v| 久久综合中文字幕| 久久手机免费观看| 久久国产黑丝| 久久久久久高潮国产精品视| 欧美在线日韩在线|