基类对象是否隐式添加到派生类中?

Are base class objects implicitly added to derived classes?

本文关键字:派生 添加 对象 是否 基类      更新时间:2023-10-16

我刚刚读到标准中的子对象是这样说的:

子对象

可以是成员子对象 (9.2(,也可以是基对象 类子对象(子句 10(或数组元素。

我在阅读C++时遇到过很多情况,其中提到了子弹射,甚至在派生类中没有子对象(显式定义(。

但这是否意味着每当类具有基类时,编译器都会在派生类中隐式添加基类类型的对象?

喜欢:

class Base
{
};
class Derived : Base
{
};

所以在派生中添加了 Base 的子对象?

标准中有什么我应该阅读的内容吗?我知道这是一个非常小的报价。

更新:

如果我们有这些类:

class Base
{
int anint;
float afloat;
};
class Derived : Base
{
//inherited member variables...
};

那么在上面的代码中,anintafloatBase的子对象吗?anintafloat也是Derived的子对象吗?并且是否还向Derived添加了看起来像Base something的成员?所以最后,Derived有三个子对象:anintafloatBase something

嗯,是的。派生最多的类将包含它派生自的每个类的子对象。引用C++17(n4659草案(,[class.derived/3]:

说明符列表指定基类的类型 派生类类型的对象中包含的子对象。 [ 示例:

struct Base {
int a, b, c;
};
struct Derived : Base {
int b;
};
struct Derived2 : Derived {
int c;
};

在这里,类 Derived2 的对象将具有类的子对象 派生的,而它又将具有类 Base 的子对象。 — 完 示例 ]

术语子对象更普遍地使用,因为继承不是形成聚合类型的唯一方法。您可以向类添加成员,这些成员也将是子对象。当你形成数组时,每个元素都是整个数组的子对象。


要解决您对问题的更新,请执行以下操作:

那么在上面的代码中,anintafloatBase的子对象吗?

是的。它们是Base的成员,因此是它的子对象。它们的内存位置布置在Base对象的内存中。

anintafloat也是Derived的子对象吗?

是的,因为包容是可传递的。Derived包含一个子对象Base

并且是否还向Derived中添加了一个看起来像Base成员?

Base子对象没有命名成员。Derived对象中只有一个内存块,其中包含构造了Base对象。

所以最后,派生有三个子对象:anint,afloat和Base?

是的。它看起来有点像这样:

+----------------------+
|+--------------------+|
|| int    |   float   ||
|+--------------------+|
| Base object (unnamed)|
+----------------------+
Derived object

但这是否意味着只要类具有基类,编译器就会在派生类中隐式添加基类类型的对象?

是的。这就是派生类,以及可以访问该基子对象的受保护成员,并隐式转换为该基子对象。