C++ sizeof()空类继承存在问题 #包括 X类 { }; Y类 { //长x;//案例A) //X;//情况B) }; Z类:公共Y、公共X { }; int main(){ Z Z; printf(“%d%d%d\n”, sizeof(Z),sizeof(Y),(char*)static_cast(&Z)-(char*)&Z); 返回0; }
为什么在取消注释案例A或案例B后输出如下: 答:C++ sizeof()空类继承存在问题 #包括 X类 { }; Y类 { //长x;//案例A) //X;//情况B) }; Z类:公共Y、公共X { }; int main(){ Z Z; printf(“%d%d%d\n”, sizeof(Z),sizeof(Y),(char*)static_cast(&Z)-(char*)&Z); 返回0; },c++,C++,为什么在取消注释案例A或案例B后输出如下: 答:4 B:2112 为什么sizeof(Y)!=sizeof(Z)在情况B)中,但在情况A)中相等。有人能解释一下吗?我对此记忆犹新,但我认为这是因为Z的两个X子对象(基类X和Y::X)必须有不同的地址。空类的大小仍然必须至少为1。但这并不意味着它们必须将该大小传递给它们的子类。只需在代码中添加一点: #include <stdio.h> class X { }; class Y { // long x; // case
4
B:
2112
为什么
sizeof(Y)!=sizeof(Z)
在情况B)中,但在情况A)中相等。有人能解释一下吗?我对此记忆犹新,但我认为这是因为Z的两个X子对象(基类X和Y::X)必须有不同的地址。空类的大小仍然必须至少为1。但这并不意味着它们必须将该大小传递给它们的子类。只需在代码中添加一点:
#include <stdio.h>
class X
{
};
class Y
{
// long x; // case A)
// X x; // case B)
};
class Z : public Y, public X
{
};
int main() {
Z z;
printf("%d %d %d\n",
sizeof(Z), sizeof(Y), (char*)static_cast<X*>(&z) - (char*)&z);
return 0;
}
因此,这两个字节由
X
对象获取。一个是基类,另一个是出现在Y
中的类 我在空基类问题上遇到了类似的问题,并找到了解释
ISO/IEC 14882:2003
10-5
基类子对象的大小可以为零(第9条);然而,两个
具有相同类类型且属于相同类的子对象
大多数派生对象不得分配在同一地址(5.10)
这意味着,如果Y的对象有两个子对象X,则两个X必须具有不同的地址(它们必须是两个具有不同地址的不同对象)
顺便说一句,空基类不必是0大小的(它说可能是),直到C++11,它声称它是必需的,更多参考:
多重继承实现的细节很复杂。比较声明类的相对大小并不是很有见地。此外,每个编译器可能都不同,您使用的是什么?
#include <stdio.h>
class X
{
};
class Y
{
// long x; // case A)
public:
X x; // case B)
};
class Z : public Y, public X
{
};
int main() {
Z z;
printf("%d %d %d\n", sizeof(Z), sizeof(Y), (char*)static_cast<X*>(&z) - (char*)&z);
printf("%p %p %p %p\n", &z, static_cast<Y*>(&z), static_cast<X*>(&z), &z.x);
return 0;
}
2 1 1
0x7fff8876fcb0 0x7fff8876fcb0 0x7fff8876fcb1 0x7fff8876fcb0
^^Z ^^Y ^^X Z::x