【发布时间】:2012-05-15 14:01:12
【问题描述】:
关于调用基类的复制构造函数,我们有以下形式:
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
我只是不明白为什么我们将派生类的对象传递给基类复制构造函数。
【问题讨论】:
标签: c++ copy-constructor
关于调用基类的复制构造函数,我们有以下形式:
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
我只是不明白为什么我们将派生类的对象传递给基类复制构造函数。
【问题讨论】:
标签: c++ copy-constructor
你还想传递什么?因为唯一的选择是从空中变出一匹神奇的小马。
这是一个典型的“隐藏在对父级的引用后面的真实类型”的东西。基类的复制 ctor 具有签名 base(const base&)。它不关心您是否传递了最派生类型、半派生类型或基类型。它只看到它关心的部分,即base,没有其他内容,因此它可以正常工作。
当然,这只适用于使用公共继承派生的类型,这形成了两者之间的关系。
【讨论】:
派生类的对象有“派生类的属性”+“基类的属性”
当我们要创建派生类的副本时,我们调用派生类的复制构造函数。本质上,我们想将“派生类的属性”+“基类的属性”复制到新对象。
派生类属性的副本由派生类复制构造函数负责。要复制基类的属性,我们需要显式调用基类的复制构造函数。
【讨论】:
看起来对派生类对象的引用正在传递,但实际上它将被隐式向上转换,这将产生对基类子对象的引用。
实际上你引用的代码完全等同于这段代码:
DerivedClass ( const DerivedClass& obj ) :
BaseClass ( static_cast<const BaseClass&>( obj ) )
{
// ...
后面的代码是完全合理的——它调用基类子对象的构造函数,传递一个对已经构造的其他对象的基子对象的引用。
【讨论】:
如果不这样做,基类会从哪里复制?
DerivedClass 是 BaseClass,因此它可以隐式转换为对BaseClass 的引用,并在BaseClass 复制构造函数中用于复制。
所以BaseClass(const BaseClass&) 负责复制BaseClass 的成员,DerivedClass(const DerivedClass&) 负责复制DerivedClass 的成员。
这样做可以避免在派生自它的每个类中复制BaseClass 复制构造函数中的复制代码,并避免在修改基类时损坏。
【讨论】: