虚继承之后,类体中到底多了一些什么?
为了更好的理解虚继承,我想着通过查看类长度,来判断继承之后类中都是包括多少内容。于是我想到了下面的程序:
#include <iostream>using namespace std;class A{public: int a;};class B1: public A{public: int b1;};class B2: public A{public: int b2;};class C:public B1,public B2{ int c;};void main(){ cout<<sizeof(A)<<endl; //a 长度:4 cout<<sizeof(B1)<<endl; //a,b1 长度:8 cout<<sizeof(B2)<<endl; //a,b2 长度:8 cout<<sizeof(C)<<endl; //a,a,b1,b2,c 长度:20}
class B1:virtual public Aclass B2:virtual public A
class C:virtual public B1, public B2class C: public B1,virtual public B2
class C:virtual public B1,virtual public B2
+--- 0 | {vbptr} 4 | c +--- +--- (virtual base A) 8 | a +--- +--- (virtual base B1)12 | {vbptr}16 | b1 +--- +--- (virtual base B2)20 | {vbptr}24 | b2 +---
[解决办法]
为了支持多态,根据目前的对象构造模型会在含有虚函数的类及其所有继承类中插入一个称作vptr的虚函数指针,所以会多出四个字节 无论你是否在继承类中对基类中的虚函数进行重新实现都会因为基类中存在虚函数而在所有的与那个基类相关的类中插入此指针项目,可以参见《深入理解C++对象模型》
[解决办法]
我在vs2010上执行如下代码
class C:virtual public B1, public B2class C: public B1,virtual public B2
[解决办法]
1、真虚继承还是假虚继承?
2、一般就是:基类的所有数据 + 自身的数据 + 虚函数列表指针 + 自身维护的一个指针
[解决办法]
除了成员之外,肯定还要有个标志说明是这么继承的,所以肯定是大于16的,再加一个标志说明继承的先后关系,就是20,如果类型不一样,比如有char,float,就要考虑字节对齐