什么是基类子对象?

  • 本文关键字:对象 基类 c++ class
  • 更新时间 :
  • 英文 :


我知道子对象是成员子对象基类子对象数组。我找不到任何能明确解释前两项的东西。在以下代码中,例如:

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; }
};

bc为基类子对象;或者用平面化的表示:

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 
};

BC基类子对象在这种表示中是不可见的,但它们仍然以各自的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实例的基类子对象是其中包含的AB的实例。每个子对象本身都有一个子对象(ab);它们不被视为C实例的子对象(因为它们是子对象的子对象),而是被视为"嵌套对象"。C的实例

相关内容

  • 没有找到相关文章

最新更新