具有钻石继承结构的孩子班级的规模似乎很奇怪

时间:2019-05-30 09:14:02

标签: c++ multiple-inheritance sizeof

我有4个班级A,B,C,D。 B和C继承A,D继承B和C。

如果A,B,C,D没有任何成员变量,则sizeof(D)返回1(这是预期的)。 但是,当B具有一个整数作为成员变量时,sizeof(D)突然变为8。

由于sizeof(int)是4,sizeof(D)是否也应该返回4?

class A
{
};

class B : public A
{
    int data;
};

class C : public A
{
};

class D : public B, public C
{
};

int main()
{
    sizeof(A); // 1
    sizeof(B); // 4
    sizeof(C); // 1
    sizeof(D); // 8?
}

1 个答案:

答案 0 :(得分:3)

您在A中有2个D子对象,它们必须具有不同的表示形式。因此,sizeof(D)上的下界1 + sizeof(int)

您使用的实现选择了D的大小为(sizeof(D) % alignof(D)) == 0

您的实现在完全空的情况下是不合格的,因为它已将两个不同的A放在同一存储中。