虚拟继承和虚表
普通繼承和虛擬繼承類的大小變化:
普通繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?虛擬繼承:
類A和類B大小為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
由此可見:1、類中靜態成員不會影響類的大小;
? ? ? ? ? ? ? ? ? ? ? ? ? ?2、當虛擬繼承時,子類中需要有一個虛基類表來記錄虛繼承關系,所以此時子類需要多一個虛基類表指針;而且只需要 ? ? ? ? ? ? ? ? ? ? ? ? 一個即可。
多重繼承+非虛擬繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??多重繼承+虛擬繼承:
各類的大小為:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
由此可見:1、在多重繼承+非虛擬繼承下基類A的的實體會在D類中存在兩份 ;
? ? ? ? ? ? ? ? ? 2、在多重繼承+虛擬繼承下基類A的的實體會在D類中只存在一份 ;
? ? ? ? ? ? ? ? ? 3、至于類B和類C的大小為何是5在上面已介紹;
? ? ? ? ? ? ? ? ? 4、至于類D的大小由以下幾點確定:
? ? ? ? ? ? ? ? ? ? ? ? 1、被類B,C,D共享的唯一一個ClassA,大小為1字節 ;
? ? ? ? ? ? ? ? ? ? ? ? 2、類B大小(5)-1+ 類C大小(5) -1 ,大小為8字節 ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、類D本身的大小,大小為0字節;
普通繼承和虛擬繼承類的虛表變化:
普通繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?虛擬繼承:
? ? ? ? ? ? ? ? ? ? ? ? ?
? ?普通繼承虛表結果: ?
? ?虛擬繼承虛表結果: ?
由此可見:當普通繼承時,子類只有一個虛表,即從父類繼承而來的虛表;當虛擬繼承時子類除了從父類繼承而來的虛表,還會有 ? ? ? ? ? ? ? ? ? ? 一個自己的虛表,即有兩個虛表。
總結
- 上一篇: Delta3d组件机制
- 下一篇: C++异常处理类与自定义异常处理类