4

基本上就是标题所说的。我一直将 Base 对象称为子对象。那是正确的吗? subobject==也是正确的superclass object吗?哪个是首选?

subclass表示派生类,表示subclass object派生类的对象,对吗?

我的困惑是subclass object!= subobject

如果这其中任何一个是正确的,无论如何..

谢谢

4

5 回答 5

26

C++ 标准对什么是子对象有明确的定义。也就是说,很多人在谈论 C++ 时(准确地说)并没有使用标准的语言。一个流行的例子是术语对象。在 Java 等语言中,有些人倾向于仅在类实例的意义上使用对象,这不适用于. 在 C++ 标准中,an是一个对象。intint

标准在 [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需要有一个完整且(内存方面)独立的类型对象。在编译时可能不知道是哪种情况,但生成的代码必须对两者都有效。FooBarpFoo->i = 5;

这一切都是在 as-if 规则下指定的,即它不必是那样的,但它必须以可观察的方式表现。此外,这不是实际的内存布局,但它是一种常见的实现。


在 [intro.object]/4

如果一个完整的对象,一个数据成员,或者一个数组元素是类类型,它的类型被认为是最派生的类,以区别于任何基类子对象的类类型;最派生类类型或非类类型的对象称为最派生对象

除了supersedesuperset之外,标准中没有使用super一词。有基类派生类(以及〜对象)。


在 C++ 语言标准之外,术语超类用于指代基类,术语子类用于指代派生类。这指的是面向对象的概念和分类,就像物种是生物学中的子类别一样。

但是在这个分类中,没有内存布局,因此没有必要谈论subobjects。有类的实例对象(在 OO 意义上),因此您可以谈论超类的对象类的对象。混淆可能源于将子类的这个对象缩写为subobject,并将 OO 语言与 C++ 标准中的语言混合。

于 2013-08-26T20:13:22.640 回答
6

当一般的面向对象术语与 C++ 相关术语混合时,就会发生这种情况。

  • 子对象:存储在另一个对象(数组元素、基类对象和数据成员对象)中的任何对象。
  • 子类:一个通用的面向对象术语,指的是 C++ 中称为“派生类”的东西
  • 超类:一个通用的面向对象术语,指的是 C++ 中的“基类”。
  • 完整对象:未存储在另一个对象中的任何对象。

只是一点提示 - 在 C++ 领域交谈时,我尝试使用 C++ 术语。在 Java 领域交谈时,我尝试使用 Java 术语。

于 2013-08-26T20:13:50.843 回答
3

对象是一个对象的 C++ 术语,它是另一个对象的一部分;成员或基类。

子类是其他语言中使用的术语,也是对继承的更一般讨论,表示派生类。这来自于将类层次结构绘制为倒置树的惯例,根在顶部。C++ 不使用这个术语,可能是因为您描述的潜在混淆。

为避免在讨论 C++ 中的继承时产生混淆,请使用类和派生类的标准术语。

于 2013-08-26T20:31:23.433 回答
0

我认为最常见的子对象混淆是指子类对象的基类相关部分(例如一些 vtable 指针),尤其是在涉及多重继承的设置中。我建议避免使用该术语并坚持使用更成熟的术语(Super/Sub、Base/Derived)。

于 2013-08-26T19:52:33.720 回答
-1

我可能会称它为父对象?

于 2013-08-26T19:45:45.420 回答