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

我刚刚阅读了标准中的子对象,他说:

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

在阅读有关提及子对象的C ++时,在派生类中甚至没有子对象(明确定义)的情况下,我遇到过很多情况。

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

喜欢:

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

那么在Derived中添加了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]:

base-specifier-list指定包含在派生类类型的对象中的基类子对象的类型。 [例如:

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

在这里,Derived2类的对象将具有Derived类的子对象,而该对象又将具有Base类的子对象。 - 结束示例]

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


为了解决您对这个问题的更新:

所以在上面的代码中,是anintafloatBase对象的子对象?

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

anintafloat也是Derived子对象吗?

是的,因为包含是传递性的。 Derived包含Base的子对象。

并且还在Derived中添加了一个成员,它看起来像Base

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

所以最后,Derived有三个子对象:anint,浮动和基地的东西?

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

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

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

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

链接地址: http://www.djcxy.com/p/78947.html

上一篇: Are base class objects implicitly added to derived classes?

下一篇: polymorphic virtual base class?