}
评注:此时sonClass2的大小变成40。与17不同的是,sonClass2的多重继承都是虚拟继承。sonClass2的大小由以下几部分构成:
1.自己本身的大小,char[3] 大小为4,一个虚函数,所以有个指向虚表的指针,大小为4,所以自身大小总的为8;
2.虚拟继承sonClass1,因为虚拟继承所以有个虚类指针ptr_sonClass2_sonClass1,大小为4,而sonClass1的大小为20,所以虚拟继承sonClass1的大小为24;
3.虚拟继承VirtualInheritance2,一个虚类指针ptr_sonClass2_VirtualInheritance2=ptr_sonClass2_sonClass1+偏移量,该指针和ptr_sonClass2_sonClass1公用一个指针,只是偏移量不同,所以大小为0(即使再多继承几个virtual class,这个指针的大小只算 一次),而VirtualInheritance2的大小为8,所以总的大小为8。
所以40=8+24+8
总结:
1,普通单继承,只需将自身成员变量的大小加上父类大小(父类中 有虚函数,子类中不管有没有)若父类没有虚函数,则子类大小需要加上指向虚表的指针大小。
2,普通多继承,若几个父类都有虚表,则子类与第一个父类公用一个虚表指针,其他有几个有虚函数的父类则就有几个虚表指针。
3,虚拟单继承,此时若子类有虚函数则加上一个自身的虚表指针的大小,(若没有则不加)再加上自身的成员变量大小,还要加上一个虚类指针ptr_sonclass_fatherclass,最后加上父类的大小。
4,多重虚拟继承,此时若子类有虚函数则加上一个自身的虚表指针的大小,(若没有则不叫)再加上自身的成员变量大小,还要加上 一个公用的虚类指针(不管有几个虚拟父类,只加一个),在加上所有父类的大小。
5、普通、虚拟混合多继承,此时子类的大小为自身大小(若子类或普通父类有虚函数,则为成员变量+虚表指针大小;若都没虚函数,则就为成员变量大小),加上一个虚类指针大小,在加上虚拟父类的大小,在加上普通父类的大小(除虚表指针,因为它和子类公用一个虚表指针)。