继承中的基类是不是复制到派生类?
Posted
技术标签:
【中文标题】继承中的基类是不是复制到派生类?【英文标题】:Are base classes in inheritance copied to the derived class?继承中的基类是否复制到派生类? 【发布时间】:2016-02-27 20:10:12 【问题描述】:正如标题所说:继承中的基类是否复制到派生类我的意思是像#include
基类中的代码被复制到派生类,或者只创建基类中的一个对象并创建子类只是在运行时使用它吗?
【问题讨论】:
有什么区别? 如果它们被创建并且派生类只是使用它,它将更像是组合(特殊类型的组合) 我不知道怎么做。您是否对语义和实现感到困惑? 一个类是一个对象工厂。类不能复制。程序可以复制对象。Derived
类的对象包含Base
类的实例作为子对象。我们使用“实例”一词而不是“复制”来防止与实际复制操作混淆。
澄清一下:你问的是基类的声明和定义是否被隐式复制到派生类的声明和定义中,并在编译期间成为派生类的声明和定义的一部分,对吗?
【参考方案1】:
继承中的基类是否复制到派生类?
不,它们没有被复制。它们本质上被合并到派生类中。
或者只是创建了一个来自基类的对象,而子类只是在运行时使用它?
这个概念描述得最接近,但是:
没有基类的对象是单独创建的。派生类的对象被创建并完全包含它的基类特性。
【讨论】:
然而,从另一个角度来看,它们被复制了。对于Derived
的每个实例和Base
的每个实例,它们都会被复制,甚至!我们几乎可以使用任何抽象场景来描述类是如何实现的,它们都没有任何内在价值,也没有任何有用的讨论方式。
@PreferenceBean “但是,从另一个角度来看……”香格里拉?好吧,从代码的角度来看,没有任何复制,只是共享。【参考方案2】:
类是编译器用来挂载代码的编程语言定义。只有实例化的类对象在运行时占用内存空间。
此时,完整对象的类(派生类和基类)被分配并与实例化对象相关联。
因此,考虑将基类复制到派生类是没有意义的,一旦为每个创建的对象分配其对应的完整类(派生+基类),当然,每个对象都有自己的实例和不与同一类的其他对象共享基类成员数据。
如果你想强制两个对象共享数据,你必须将它的一些成员定义为指向共享数据的指针。
【讨论】:
所以它们被放置在内存中的每一部分(类的基础部分和派生部分)并且它们只是连接在一起,ABI 与此有什么关系吗? 【参考方案3】:基本上这都是抽象的看待它的方式。
我认为公平地说编译器通过在其计算中包含基类型的定义来计算派生类型的size
。所以它为两者分配了足够的内存。
然后构造基类在分配的内存的第一部分调用它的构造函数,然后构造派生类在分配的内存的第二部分使用派生类的构造函数。
在一天结束的时候,你会得到一块足够大的内存(一个对象)来保存基类成员对象和派生类成员对象。生成的成员函数每个都有相应计算的成员变量地址偏移量(从分配的内存开始)。
所以我不认为任何东西实际上是“复制”的,每个部分都构造到它分配的内存部分。
两个曲奇刀和一大块糕点。
【讨论】:
以上是关于继承中的基类是不是复制到派生类?的主要内容,如果未能解决你的问题,请参考以下文章
shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类