C++消歧:子对象和子类对象

3 c++ inheritance subclass

基本上标题是什么.我一直将Base对象称为子对象.这是正确的,subobject== 也是正确的superclass object吗?哪一个更受欢迎?

subclass方法的派生类和subclass object手段派生类的对象,对不对?

我的困惑是subclass object!= subobject.

如果这是正确的,无论如何..

谢谢

dyp*_*dyp 15

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

标准在[intro.object]/2中所说的内容:

对象可以包含其他对象,称为子对象.子对象可以是成员子对象,基类子对象或数组元素.不是任何其他对象的子对象的对象称为完整对象.

这应该在(可能的)存储器布局的上下文中理解.它没有完全指定,但很可能看起来像这样:

class Foo { int i; };
class Bar : public Foo { int j; };
Run Code Online (Sandbox Code Playgroud)

类型的对象Bar在内存中看起来像这样:

+-Bar-------------------+
|  +-Foo-----+          |
|  |  int i  |  int j;  |
|  +---------+          |
+-----------------------+

也就是说,成员Foo是成员Bar一样的直接成员Bar.Bar因此,每个对象"包含"一个类型的对象Foo.还考虑一下

Bar b;
Bar* pBar = &b;
Foo* pFoo = &b;
Run Code Online (Sandbox Code Playgroud)
+-Bar-------------------+
|  +-Foo-----+          |
|  |  int i  |  int j;  |
|  +---------+          |
+--^--------------------+
^  |pFoo
|pBar

为了允许pFoo指向类型的完整对象和类型的Foo子对象Foo,需要Foo在任何类型的对象内部存在整个和(内存方面)类型的独立对象Bar.在编译时可能不知道哪一个是这种情况,但生成的代码pFoo->i = 5;必须适用于两者.

这一切都在as-if规则下指定,即它不一定是这样,但它必须以这种方式表现出来.此外,不要求这是实际的内存布局,但它是一种常见的实现方式.


在[intro.object]/4中

如果完整对象,数据成员或数组元素属于类类型,则其类型被视为派生程度最高的类,以区别于任何基类子对象的类类型; 最派生类类型或非类类型的对象称为最派生对象.

除了取代超集之外,标准中没有使用super这个词.有基类派生类(以及〜对象).


在C++语言标准之外,术语超类用于引用基类,术语子类用于引用派生类.这指的是OO概念和分类,很像物种是生物学中的一个的子类别.

但在这种分类中,没有内存布局,因此无需谈论子对象.有实例对象(在OO意义上)的类,所以你可以谈论一个超类对象子类的对象.混淆可能源于将子类子对象缩写为子对象,以及将OO的语言与C++标准的语言混合.


Joh*_*itb 5

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

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

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