map*_*ple 6 c++ virtual-functions multiple-inheritance
示例代码如下:
class A
{
public:
int k;
virtual int f();
};
class B:public virtual A
{
public:
virtual int a();
};
int main()
{
cout<<sizeof(A)<<sizeof(B);
}
Run Code Online (Sandbox Code Playgroud)
它打印
8 12
它似乎class B有自己的新虚函数表.
如果class A更改为:
class A
{
public:
virtual int f();
};
Run Code Online (Sandbox Code Playgroud)
它打印
4 4
谁有人解释原因?
在子类 B 中,B 是 A 的虚拟子类。因此,B 在子对象 A 上的指针之上有一个单独的 vtbl 指针(4 个字节)。因此,
sizeof(B object)
= sizeof(A object) + sizeof (vtbl pointer of B)
= sizeof(int) + sizeof (vtbl pointer of A) + sizeof (vtbl pointer of B)
= 4 + 4 + 4
= 12
Run Code Online (Sandbox Code Playgroud)
和,
sizeof(A object)
= sizeof(int) + sizeof (vtbl pointer of A)
= 4 + 4
= 8
Run Code Online (Sandbox Code Playgroud)
如果B是A的普通子类,
sizeof(B object)
= sizeof(A object)
= sizeof(int) + sizeof (vtbl pointer of A)
= 4 + 4
= 12
Run Code Online (Sandbox Code Playgroud)
对于空类 A,为 sizeof A 对象分配的最小大小为 vtbl = 4 的 sizeof 指针,并且由于 A 的实例数据为空,因此空类的虚拟继承不会增加该对象的大小