具有菱形继承结构的 child class 的大小似乎很奇怪
Size of child class with diamond inheritance structure seems strange
我有 4 个 类 A、B、C、D。
B和C继承A,D继承B和C。
如果A、B、C、D没有任何成员变量,sizeof(D)
returns 1(这是预期的)。
但是当B有一个整数作为成员变量时,sizeof(D)
突然变成了8.
因为 sizeof(int)
是 4,所以 sizeof(D)
return 不应该也是 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?
}
您在 D
中有 2 个 A
个子对象,它们必须具有不同的表示。因此 sizeof(D)
上的 下限 是 1 + sizeof(int)
。
您使用的实现选择 D
的大小使得 (sizeof(D) % alignof(D)) == 0
.
在完全空的情况下,您的实现是 non-conforming,因为它已将两个不同的 A
放在同一存储中。
我有 4 个 类 A、B、C、D。 B和C继承A,D继承B和C。
如果A、B、C、D没有任何成员变量,sizeof(D)
returns 1(这是预期的)。
但是当B有一个整数作为成员变量时,sizeof(D)
突然变成了8.
因为 sizeof(int)
是 4,所以 sizeof(D)
return 不应该也是 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?
}
您在 D
中有 2 个 A
个子对象,它们必须具有不同的表示。因此 sizeof(D)
上的 下限 是 1 + sizeof(int)
。
您使用的实现选择 D
的大小使得 (sizeof(D) % alignof(D)) == 0
.
在完全空的情况下,您的实现是 non-conforming,因为它已将两个不同的 A
放在同一存储中。