虚拟继承和虚表
普通繼承和虛擬繼承類(lèi)的大小變化:
普通繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?虛擬繼承:
類(lèi)A和類(lèi)B大小為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
由此可見(jiàn):1、類(lèi)中靜態(tài)成員不會(huì)影響類(lèi)的大小;
? ? ? ? ? ? ? ? ? ? ? ? ? ?2、當(dāng)虛擬繼承時(shí),子類(lèi)中需要有一個(gè)虛基類(lèi)表來(lái)記錄虛繼承關(guān)系,所以此時(shí)子類(lèi)需要多一個(gè)虛基類(lèi)表指針;而且只需要 ? ? ? ? ? ? ? ? ? ? ? ? 一個(gè)即可。
多重繼承+非虛擬繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??多重繼承+虛擬繼承:
各類(lèi)的大小為:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
由此可見(jiàn):1、在多重繼承+非虛擬繼承下基類(lèi)A的的實(shí)體會(huì)在D類(lèi)中存在兩份 ;
? ? ? ? ? ? ? ? ? 2、在多重繼承+虛擬繼承下基類(lèi)A的的實(shí)體會(huì)在D類(lèi)中只存在一份 ;
? ? ? ? ? ? ? ? ? 3、至于類(lèi)B和類(lèi)C的大小為何是5在上面已介紹;
? ? ? ? ? ? ? ? ? 4、至于類(lèi)D的大小由以下幾點(diǎn)確定:
? ? ? ? ? ? ? ? ? ? ? ? 1、被類(lèi)B,C,D共享的唯一一個(gè)ClassA,大小為1字節(jié) ;
? ? ? ? ? ? ? ? ? ? ? ? 2、類(lèi)B大小(5)-1+ 類(lèi)C大小(5) -1 ,大小為8字節(jié) ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、類(lèi)D本身的大小,大小為0字節(jié);
普通繼承和虛擬繼承類(lèi)的虛表變化:
普通繼承: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?虛擬繼承:
? ? ? ? ? ? ? ? ? ? ? ? ?
? ?普通繼承虛表結(jié)果: ?
? ?虛擬繼承虛表結(jié)果: ?
由此可見(jiàn):當(dāng)普通繼承時(shí),子類(lèi)只有一個(gè)虛表,即從父類(lèi)繼承而來(lái)的虛表;當(dāng)虛擬繼承時(shí)子類(lèi)除了從父類(lèi)繼承而來(lái)的虛表,還會(huì)有 ? ? ? ? ? ? ? ? ? ? 一個(gè)自己的虛表,即有兩個(gè)虛表。
總結(jié)
- 上一篇: Delta3d组件机制
- 下一篇: CDH - 启动HbaseMaster时