基本上就是标题所说的。我一直将 Base 对象称为子对象。那是正确的吗? subobject
==也是正确的superclass object
吗?哪个是首选?
subclass
表示派生类,表示subclass object
派生类的对象,对吗?
我的困惑是subclass object
!= subobject
。
如果这其中任何一个是正确的,无论如何..
谢谢
基本上就是标题所说的。我一直将 Base 对象称为子对象。那是正确的吗? subobject
==也是正确的superclass object
吗?哪个是首选?
subclass
表示派生类,表示subclass object
派生类的对象,对吗?
我的困惑是subclass object
!= subobject
。
如果这其中任何一个是正确的,无论如何..
谢谢
C++ 标准对什么是子对象有明确的定义。也就是说,很多人在谈论 C++ 时(准确地说)并没有使用标准的语言。一个流行的例子是术语对象。在 Java 等语言中,有些人倾向于仅在类实例的意义上使用对象,这不适用于. 在 C++ 标准中,an是一个对象。int
int
标准在 [intro.object]/2 中所说的:
对象可以包含其他对象,称为子对象。子对象可以是成员子对象、基类子对象或数组元素。不是任何其他对象的子对象的对象称为完整对象。
这是在(可能的)内存布局的上下文中理解的。它没有完全指定,但很可能看起来像这样:
class Foo { int i; };
class Bar : public Foo { int j; };
类型的对象Bar
在内存中可能如下所示:
+-酒吧-------------------+ | +-Foo-----+ | | | 诠释我 | 诠释 j; | | +---------+ | +------------------------+
也就是说, 的成员Foo
是 的成员,Bar
就像 的直接成员一样Bar
。因此的每个对象都Bar
“包含”一个 类型的对象Foo
。还要考虑
Bar b;
Bar* pBar = &b;
Foo* pFoo = &b;
+-酒吧-------------------+ | +-Foo-----+ | | | 诠释我 | 诠释 j; | | +---------+ | +--^--------------------+ ^ |pFoo |pBar
为了允许pFoo
指向完整的类型对象和类型Foo
的子对象,在任何类型的对象中都Foo
需要有一个完整且(内存方面)独立的类型对象。在编译时可能不知道是哪种情况,但生成的代码必须对两者都有效。Foo
Bar
pFoo->i = 5;
这一切都是在 as-if 规则下指定的,即它不必是那样的,但它必须以可观察的方式表现。此外,这不是实际的内存布局,但它是一种常见的实现。
在 [intro.object]/4
如果一个完整的对象,一个数据成员,或者一个数组元素是类类型,它的类型被认为是最派生的类,以区别于任何基类子对象的类类型;最派生类类型或非类类型的对象称为最派生对象。
除了supersede和superset之外,标准中没有使用super一词。有基类和派生类(以及〜对象)。
在 C++ 语言标准之外,术语超类用于指代基类,术语子类用于指代派生类。这指的是面向对象的概念和分类,就像物种是生物学中属的子类别一样。
但是在这个分类中,没有内存布局,因此没有必要谈论subobjects。有类的实例或对象(在 OO 意义上),因此您可以谈论超类的对象和子类的对象。混淆可能源于将子类的这个对象缩写为subobject,并将 OO 语言与 C++ 标准中的语言混合。
当一般的面向对象术语与 C++ 相关术语混合时,就会发生这种情况。
只是一点提示 - 在 C++ 领域交谈时,我尝试使用 C++ 术语。在 Java 领域交谈时,我尝试使用 Java 术语。
子对象是一个对象的 C++ 术语,它是另一个对象的一部分;成员或基类。
子类是其他语言中使用的术语,也是对继承的更一般讨论,表示派生类。这来自于将类层次结构绘制为倒置树的惯例,根在顶部。C++ 不使用这个术语,可能是因为您描述的潜在混淆。
为避免在讨论 C++ 中的继承时产生混淆,请使用基类和派生类的标准术语。
我认为最常见的子对象混淆是指子类对象的基类相关部分(例如一些 vtable 指针),尤其是在涉及多重继承的设置中。我建议避免使用该术语并坚持使用更成熟的术语(Super/Sub、Base/Derived)。
我可能会称它为父对象?