基本上标题是什么.我一直将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++标准的语言混合.
当通用的面向对象的术语与C ++相关的术语混合在一起时,就会发生这种情况。
只是一点提示-在C ++领域中进行交谈时,我尝试使用C ++术语。在Java领域中进行交谈时,我尝试与Java术语进行交谈。