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