【问题标题】:Why passing derived class type as parameter when calling base class copy constructor (C++)?为什么在调用基类复制构造函数(C++)时将派生类类型作为参数传递?
【发布时间】:2012-05-15 14:01:12
【问题描述】:

关于调用基类的复制构造函数,我们有以下形式:

DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj ) 
{ 
// ... 
} 

我只是不明白为什么我们将派生类的对象传递给基类复制构造函数。

【问题讨论】:

    标签: c++ copy-constructor


    【解决方案1】:

    你还想传递什么?因为唯一的选择是从空中变出一匹神奇的小马。

    这是一个典型的“隐藏在对父级的引用后面的真实类型”的东西。基类的复制 ctor 具有签名 base(const base&)。它不关心您是否传递了最派生类型、半派生类型或基类型。它只看到它关心的部分,即base,没有其他内容,因此它可以正常工作。

    当然,这只适用于使用公共继承派生的类型,这形成了两者之间的关系。

    【讨论】:

      【解决方案2】:

      派生类的对象有“派生类的属性”+“基类的属性”

      当我们要创建派生类的副本时,我们调用派生类的复制构造函数。本质上,我们想将“派生类的属性”+“基类的属性”复制到新对象。

      派生类属性的副本由派生类复制构造函数负责。要复制基类的属性,我们需要显式调用基类的复制构造函数。

      【讨论】:

        【解决方案3】:

        看起来对派生类对象的引用正在传递,但实际上它将被隐式向上转换,这将产生对基类子对象的引用。

        实际上你引用的代码完全等同于这段代码:

        DerivedClass ( const DerivedClass& obj ) :
            BaseClass ( static_cast<const BaseClass&>( obj ) )
        { 
        // ...
        

        后面的代码是完全合理的——它调用基类子对象的构造函数,传递一个对已经构造的其他对象的基子对象的引用。

        【讨论】:

          【解决方案4】:

          如果不这样做,基类会从哪里复制?

          DerivedClass BaseClass,因此它可以隐式转换为对BaseClass 的引用,并在BaseClass 复制构造函数中用于复制。

          所以BaseClass(const BaseClass&amp;) 负责复制BaseClass 的成员,DerivedClass(const DerivedClass&amp;) 负责复制DerivedClass 的成员。

          这样做可以避免在派生自它的每个类中复制BaseClass 复制构造函数中的复制代码,并避免在修改基类时损坏。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-28
            • 2021-02-14
            • 1970-01-01
            • 2015-08-18
            • 2020-04-07
            • 2016-07-19
            • 2013-05-11
            • 2017-12-18
            相关资源
            最近更新 更多