我知道子对象是成员子对象,基类子对象和数组。我找不到任何能明确解释前两个术语的东西。例如,在以下代码中:
struct A{int a;};
struct B{int b;};
struct C:public A,public B{};我认为:int a是A类型的可能的、尚未实例化的对象的成员子对象;int a是一个可能的、尚未实例化的C类型对象的基类子对象。对吗?成员子对象和基类子对象的定义是什么?你能举个例子吗?
发布于 2021-10-27 12:58:53
每当一个类从另一个类继承时,它也继承该类的一个实例:
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 : A { };
class C : virtual A { };
class D : virtual A { };
class E : A, B, C
{
A combinedAFromCAndD;
// other members of B
// other members of C
A separateAFromD
// other members of D
};注意:上面的这些布局只是例子,具体布局可能会有所不同。
发布于 2021-10-27 12:38:34
在您的代码中,C实例的基类子对象是包含在其中的A和B的实例。每个子对象本身都有一个子对象本身(a和b);这些子对象不被认为是C实例的子对象(因为它们是子对象的子对象),而是被认为是C实例的“嵌套对象”。
https://stackoverflow.com/questions/69738775
复制相似问题