普通继承和虚拟继承类的大小变化:
普通继承: 虚拟继承:
类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字节;
普通继承和虚拟继承类的虚表变化:
普通继承: 虚拟继承:
普通继承虚表结果:
虚拟继承虚表结果:
由此可见:当普通继承时,子类只有一个虚表,即从父类继承而来的虚表;当虚拟继承时子类除了从父类继承而来的虚表,还会有 一个自己的虚表,即有两个虚表。