有人可以解释在涉及虚函数的虚拟继承的情况下类的大小.
class A{
char k[ 3 ];
public:
virtual void a(){};
};
class B : public A{
char j[ 3 ];
public:
virtual void b(){};
};
class C : public virtual A{
char i[ 3 ];
public:
virtual void c(){};
};
class D : public B, public C{
char h[ 3 ];
public:
virtual void d(){};
};
Run Code Online (Sandbox Code Playgroud)
类的大小输出是:
sizeof(A): 8
sizeof(B): 12
sizeof(C): 16
sizeof(D): 32
Run Code Online (Sandbox Code Playgroud)
我正在使用的编译器是
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
可能重复:
虚拟对象大小
虚拟继承是否会更改派生类的大小?我执行了以下代码,其中有两个派生类,一个是虚拟继承的,另一个是非虚拟继承的:
class A {
public:
int a;
virtual void a1();
};
class non_vir_der: public A{
public:
int c;
virtual void aa();
};
class vir_der: public virtual A{
public:
int d;
virtual void bb();
};
int main()
{
cout<<sizeof(non_vir_der)<<"\n";
cout<<sizeof(vir_der)<<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
12(imo:4(int a)+ 4(int c)+ 4(vir ptr))
再次检查我是否错过了什么,我尝试了所需的最小代码,删除了类中的所有整数,输出为:
4
第二个输出表明两个派生类的大小相同.为什么第一次运行中的vir_der 16的大小,为什么不是12?