我知道多继承的内存布局没有定义,所以我不应该依赖它.但是,我可以在特殊情况下依赖它.也就是说,一个班级只有一个"真正的"超级班级.所有其他都是"空类",即既没有字段也没有虚拟方法的类(即它们只有非虚方法).在这种情况下,这些附加类不应该向类的内存布局添加任何内容.(更简洁地说,在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)
这里,Y类X是唯一真正的基类.程序的输出(在linux上用g ++ 4.6编译时)如下:
8
0x233f010
0x233f010
0x233f010
0x233f010 …
我知道子对象是成员子对象、基类子对象和数组。我找不到任何明确解释前两个术语的内容。以下面的代码为例:
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 类型对象的基类子对象。对吗?成员子对象和基类子对象的定义是什么?您能提供一些例子吗?