深度探索C++ 对象模型(7)-Data member的布局(虚继承)
- 虛擬繼承
布局分為兩種情況
- windows方案
ObjectConDerived::test();//輸出結果:Point2d類、Point3d類、Vertex、Vertex3d類的大小:12 24 24 40
- virtual base class subobject部分在最后面,而base class根據繼承的順序依次排列
- 在每一個derived class object中安插了一個指針,這個指針用來指向virtual base class subobject(共享部分)//缺點:占空間
- 因此要對共享部分進行存取,可以通過相關指針間接
- unix方案
ObjectConDerived::test();//輸出結果???
- 在virtual function table 中放置virtual base class的offset(不是地址)
- 共享局部的位置會因為每次的派生而發送變化
- 虛擬繼承串鏈的加長,導致間接存取層次的增加。例如:如果我們有三層虛擬衍化,我就需要三次間接存取(經由三個virtual base class指針)。解決方案有:拷貝所有的virtual base class 的指針到drived class中。這樣就解決了存取時間的問題,雖然會有空間的開銷。
【引用】
[1]: <<深度探索C++ 對象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 譯
[2]: 代碼地址 https://github.com/thefistlei/cplusStudy.git
總結
以上是生活随笔為你收集整理的深度探索C++ 对象模型(7)-Data member的布局(虚继承)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度探索C++ 对象模型(7)-Data
- 下一篇: 《研磨设计模式》chap2 简单工厂si