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++ 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

为什么在取消注释案例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 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