子对象和包含对象有什么区别?为了构造从另一个类派生的类的实例,首先必须创建子对象,然后必须创建派生对象。
问题:
派生对象是否包含子对象?
如何可视化对象结构的差异
a) 其中包含另一个对象
b) 派生自另一个类
a) 和 b) 中的对象是否具有相同的结构?
子对象和包含对象有什么区别?为了构造从另一个类派生的类的实例,首先必须创建子对象,然后必须创建派生对象。
问题:
派生对象是否包含子对象?
如何可视化对象结构的差异
a) 其中包含另一个对象
b) 派生自另一个类
a) 和 b) 中的对象是否具有相同的结构?
是的,派生对象包含其基类子对象的实例。
从物理上讲,包含对象(作为成员)和从对象派生之间实际上没有区别。此外,该语言将两者都称为子对象:基类子对象和成员子对象。
虚拟继承通常会引入一些额外的家庭数据,这使得它比仅仅“包含”一个基础子对象更加复杂,但普通继承通常归结为简单的“包含”。
派生和包含成员之间的区别实际上仅存在于概念级别。不同的访问语法,不同的功能。例如,涉及到多态等语言特征的派生。
在 C++ 中,区别在于虚方法。派生类可以重新定义基本子对象虚拟方法。包含的对象保持原样。这或多或少是基里尔的回答——但我希望答案更简单一些。
是的,派生对象包含子对象。这么说也没错。虽然推导有点多。可以直接访问数据成员和方法。虚函数占用 VMT 中的插槽。当对象被包含时,这一切都不会发生。
可视化差异。没有普遍接受的方法来做到这一点。从内存布局的角度来看,区别在于 VMT。包含的对象有自己的 VMT 字段(如果有的话)。派生对象有自己的 VMT,它是通过添加新条目和替换一些条目从基础对象的 VMT 中创建的。