相关疑难解决方法(0)

带有"空类"的C++多重继承内存布局

我知道多继承的内存布局没有定义,所以我不应该依赖它.但是,我可以在特殊情况下依赖它.也就是说,一个班级只有一个"真正的"超级班级.所有其他都是"空类",即既没有字段也没有虚拟方法的类(即它们只有非虚方法).在这种情况下,这些附加类不应该向类的内存布局添加任何内容.(更简洁地说,在C++ 11中,该类具有标准布局)

我可以推断出所有超类都没有偏移吗?例如:

#include <iostream>

class X{

    int a;
    int b;
};

class I{};

class J{};

class Y : public I, public X,  public J{};

int main(){

    Y* y = new Y();
    X* x = y;
    I* i = y;
    J* j = y;

    std::cout << sizeof(Y) << std::endl 
                  << y << std::endl 
                  << x << std::endl 
                  << i << std::endl 
                  << j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这里,YX是唯一真正的基类.程序的输出(在linux上用g ++ 4.6编译时)如下:

8

0x233f010

0x233f010

0x233f010

0x233f010 …

c++ multiple-inheritance memory-alignment

8
推荐指数
1
解决办法
2508
查看次数

什么是基类子对象?

我知道子对象是成员子对象基类子对象数组。我找不到任何明确解释前两个术语的内容。以下面的代码为例:

struct A{int a;};
struct B{int b;};
struct C:public A,public B{};
Run Code Online (Sandbox Code Playgroud)

我认为:int a是一个可能的、尚未实例化的 A 类型对象的成员子对象;int a是一个可能的、尚未实例化的 C 类型对象的基类子对象。对吗?成员子对象基类子对象的定义是什么?您能提供一些例子吗?

c++ class

1
推荐指数
1
解决办法
422
查看次数