首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是基类子对象?

什么是基类子对象?
EN

Stack Overflow用户
提问于 2021-10-27 12:34:11
回答 2查看 209关注 0票数 1

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

代码语言:javascript
复制
struct A{int a;};
struct B{int b;};
struct C:public A,public B{};

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-27 12:58:53

每当一个类从另一个类继承时,它也继承该类的一个实例:

代码语言:javascript
复制
class A { };
class B : A { };

然后B类内部看起来如下:

代码语言:javascript
复制
class B
{
    A a; // <- implicit base class sub-object, not visible to you
};

请注意,在某些情况下,甚至可能有一个以上的A!

代码语言:javascript
复制
class A { };
class B : A { };
class C : A { };
class D : C, B { };

D内部情况如下:

代码语言:javascript
复制
class D
{
    B b; // { A a; }
    C c; // { A a; }
};

bc为基类子对象;或在扁平表示中:

代码语言:javascript
复制
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实例然后组合成一个实例(尽管如果存在非实际继承的实例,这些实例仍然与合并的实例并行),请考虑:

代码语言:javascript
复制
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
};

注意:上面的这些布局只是例子,具体布局可能会有所不同。

票数 4
EN

Stack Overflow用户

发布于 2021-10-27 12:38:34

在您的代码中,C实例的基类子对象是包含在其中的AB的实例。每个子对象本身都有一个子对象本身(ab);这些子对象不被认为是C实例的子对象(因为它们是子对象的子对象),而是被认为是C实例的“嵌套对象”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69738775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档