3

子对象包含对象有什么区别?为了构造从另一个类派生的类的实例,首先必须创建子对象,然后必须创建派生对象。

问题:

  1. 派生对象是否包含子对象?

  2. 如何可视化对象结构的差异

    a) 其中包含另一个对象

    b) 派生自另一个类

    a) 和 b) 中的对象是否具有相同的结构?

4

3 回答 3

4

是的,派生对象包含其基类子对象的实例。

从物理上讲,包含对象(作为成员)和从对象派生之间实际上没有区别。此外,该语言将两者都称为子对象:基类子对象和成员子对象。

虚拟继承通常会引入一些额外的家庭数据,这使得它比仅仅“包含”一个基础子对象更加复杂,但普通继承通常归结为简单的“包含”。

派生和包含成员之间的区别实际上仅存在于概念级别。不同的访问语法,不同的功能。例如,涉及到多态等语言特征的派生。

于 2012-07-11T07:37:19.550 回答
2

在 C++ 中,区别在于虚方法。派生类可以重新定义基本子对象虚拟方法。包含的对象保持原样。这或多或少是基里尔的回答——但我希望答案更简单一些。

于 2012-07-11T08:43:08.977 回答
1

是的,派生对象包含子对象。这么说也没错。虽然推导有点多。可以直接访问数据成员和方法。虚函数占用 VMT 中的插槽。当对象被包含时,这一切都不会发生。

可视化差异。没有普遍接受的方法来做到这一点。从内存布局的角度来看,区别在于 VMT。包含的对象有自己的 VMT 字段(如果有的话)。派生对象有自己的 VMT,它是通过添加新条目和替换一些条目从基础对象的 VMT 中创建的。

于 2012-07-11T07:31:52.517 回答