关于基类的调用复制构造函数,我们有以下形式:
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
我只是不明白为什么我们将派生类的对象传递给基类复制构造函数。
答案 0 :(得分:2)
你还想通过什么?因为唯一的另一种选择是从空中召唤出一只神奇的小马。
这是一个典型的“隐藏在对父母的引用背后的真实类型”的事情。基类'copy ctor具有签名base(const base&)
。如果传递最派生类型,半派生类型或基类型,则无关紧。它只能看到它关心的部分,即base
,而不是其他任何部分,因此它可以正常工作。
当然,这只适用于使用公共继承派生的类型,它们是两者之间的关系。
答案 1 :(得分:1)
看起来正在传递对派生类对象的引用,但实际上它将是隐式上传并且将产生对基类子对象的引用。
有效地,您引用的代码完全等同于此代码:
DerivedClass ( const DerivedClass& obj ) :
BaseClass ( static_cast<const BaseClass&>( obj ) )
{
// ...
后一个代码非常合理 - 它通过向已经构造的其他对象的基础子对象传递引用来调用基类子对象构造函数。
答案 2 :(得分:1)
派生类的对象具有“派生类的属性”+“基类的属性”
当我们想要创建派生类的副本时,我们调用派生类的copy构造函数。基本上我们想要将“派生类的属性”+“基类的属性”复制到新对象。
派生类属性的副本由派生类复制构造函数处理。要复制基类的属性,我们需要显式调用基类复制构造函数。
答案 3 :(得分:0)
如果你没有,那么基类会从哪里复制?
DerivedClass
是 BaseClass
,因此可以将其隐式投放到对BaseClass
的引用,并在BaseClass
副本中使用要从中复制的构造函数。
因此BaseClass(const BaseClass&)
负责复制BaseClass
的成员,DerivedClass(const DerivedClass&)
负责复制DerivedClass
的成员。
这样做可以避免在从它派生的每个类中复制BaseClass
复制构造函数中的复制代码,并避免在修改基类时破坏。