多重继承的虚函数表

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

谁有人解释原因?

Dr.*_*ana 1

在子类 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 的实例数据为空,因此空类的虚拟继承不会增加该对象的大小