• <tt id="lutwa"></tt>

    <b id="lutwa"></b>

  • <u id="lutwa"><small id="lutwa"></small></u>
    <b id="lutwa"><small id="lutwa"></small></b>
    
    
    <u id="lutwa"><small id="lutwa"></small></u>
  • <u id="lutwa"><small id="lutwa"></small></u>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C++培訓課程--菱形繼承產生的問題及解決

    • 發布:C++培訓
    • 來源:網絡
    • 時間:2020-12-11 16:56

    C++程序優化,今天我來講講C++培訓課程中菱形繼承產生的問題及解決。

    1.何為菱形繼承?

    C++培訓課程菱形繼承產生的問題及解決

    兩個子類繼承同一個父類,而又有子類又分別繼承這兩個子類,就如上圖說示:

    View Code

    產生的問題,會產生二義性問題,即對于baseClass的調用要說明作用域的情況:

    D *pd=new D;

    pd->B::a=1;

    pd->C::a=2;

    printf("%d\n",pd->B::a);

    printf("%d\n",pd->C::a);

    相當于baseClass在類中有兩個,這可能不是我們想要的結果,增加調用的困難,同時也會浪費內存資源。

    這種結構如圖:


    C++培訓課程菱形繼承產生的問題及解決

    可以看到A指向的虛函數表的位置是不一樣的!即baseClass有兩個實例!

    2.如何解決?

    使用虛擬繼承!

    View Code

    內存布局:

    C++培訓課程菱形繼承產生的問題及解決

    對于baseClass是公用的,也就是baseClass就實例化了一個對象!想想這會有什么后果?調用B,C的虛函數的時候就一個虛表怎么行,所以有需要對應有兩個相應的虛表指向B,C,于是就成了上面的結構了。

    調試觀察,果然如此!

    C++培訓課程菱形繼承產生的問題及解決

    總結:可以通過虛擬繼承消除二義性,但是虛擬繼承的開銷是增加虛函數指針。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C++培訓筆記--在繼承中普通函數,純虛函數、虛函數、的關系
    下一篇:C++培訓課程筆記--拷貝構造函數中的陷阱
    • 關注微信公眾號

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美牲交av欧美牲交aⅴ暴力,俄罗斯freeⅹ性欧美,日本加勒比无码中文字幕,放荡的女教师中文字幕