在64位的mac机器上用gcc测试的结果(指针是8bytes的):
1. 对于一个含有虚表的类,其虚表指针放在最开始,然后才是类成员。
2. 对于一个含有虚表的类, 其继承子类(只有一个父类), 共用同一个虚表指针
3. 如果一个父类含有虚表,另外一个没有,则有虚表的父类布局在前,没有的在后,这可能是gcc的一个优化,这样就可以共用一个虚表指针了。
4.如果两个父类型都有续表, 则按照声明的前后,进行布局,其中第一个父类和子类共用一个虚表指针,第一个父类的虚表指针、成员变量,然后第二个父类的续表指针、成员变量、子类的成员变量,
5. 如果两个父类都有虚表, 但是一个虚继承,一个非虚继承,则由于子类需要和废墟继承的父类共用一个虚表指针,则非虚继承的父类在前,虚继承的在后,第一个是父类的虚表指针、成员变量,然后是子类的成员变量,虚继承的父类的虚表指针、成员函数(保持虚继承的父类的完整性)
6.如果两个父类都有虚表, 都是虚继承,则按照定义的顺序布局,由于要保持父类的完整性,因此虚表指针不再共享,第一个是子类的虚表指针、成员函数,第一个父类的虚表指针、成员变量,第二个父类的虚表指针、成员变量。
对于虚继承的情况,虚继承的父类要保持完整性(独立的虚表指针,不和子类共用),放置到最后(子类的成员变量之后),对于普通的继承,能够和子类共享的虚表指针的父类会被放置到最前面的。