我知道子对象是成员子对象,基类子对象和数组。我找不到任何能明确解释前两项的东西。在以下代码中,例如:
struct A{int a;};
struct B{int b;};
struct C:public A,public B{};
我认为:int a
是一个可能的,尚未实例化的a类型对象的成员子对象;int a
是一个可能的、尚未实例化的c类型对象的基类子对象,对吗?成员子对象和基类子对象的定义是什么?你能举个例子吗?
当一个类从另一个类继承时,它也继承了那个类的一个实例:
class A { };
class B : A { };
那么类B内部看起来像:
class B
{
A a; // <- implicit base class sub-object, not visible to you
};
请注意,在某些情况下甚至可能有多个A!
class A { };
class B : A { };
class C : A { };
class D : C, B { };
D在内部看起来像:
class D
{
B b; // { A a; }
C c; // { A a; }
};
,b
和c
为基类子对象;或者用平面化的表示:
class D
{
A aFromB; // inherited from B, but not a sub-object of D itself
// other members of B
A aFromC; // inherited from C, again not a sub-object of D
// other members of C
};
B
和C
基类子对象在这种表示中是不可见的,但它们仍然以各自的A
实例与各自的其他成员组合的形式存在(考虑周围有大括号)。
如果您想避免重复的A
,您需要虚拟继承:class B : virtual A { }
——然后将A
的所有虚拟继承(直接或间接)实例合并为一个单独的实例(尽管如果有非虚拟继承的实例,它们仍然与合并的实例并行),考虑:
class A { };
class B : virtual A { };
class C : virtual A { };
class D : A { };
class E : B, C, D
{
A combinedAFromBAndC;
// other members of B
// other members of C
A separateAFromD
// other members of D
};
注意:以上这些布局只是示例,具体布局可能会有所不同。
在您的代码中,C
实例的基类子对象是其中包含的A
和B
的实例。每个子对象本身都有一个子对象(a
和b
);它们不被视为C
实例的子对象(因为它们是子对象的子对象),而是被视为"嵌套对象"。C
的实例