【问题标题】:Copy Constructor for derived class派生类的复制构造函数
【发布时间】:2019-07-24 06:41:30
【问题描述】:

我有一个基类

class Keyframebase
  {

    private:
std::string stdstrName;
float time;
KeyframeType keyframeType;

    public:
Keyframebase();
Keyframebase(KeyframeType keyType);
Keyframebase(const Keyframebase &key);
Keyframebase& operator = (const Keyframebase &key);
std::string getName();

  };

由另一个类派生。

   class SumKeyframeXYZ : public Keyframebase
      {
         private:
float x; 
float y;
float z;

          public:
SumKeyframeXYZ();
SumKeyframeXYZ(float x, float y, float z);
SumKeyframeXYZ(const SumKeyframeXYZ& key);
//  const Sum_Position& operator=(const Container& container);
SumKeyframeXYZ& operator=(const SumKeyframeXYZ& key);
void setValue(float x, float y, float z);  
  };

这是 Derived 类的复制构造函数。

SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase( 
 key )
       {
        this->x = key.x;
        this->y = key.y;
        this->z = key.z;
       } 

因为当我复制派生类的对象时我也想复制基类成员,所以这是将派生类对象作为参数提供给基类​​的正确方法。

【问题讨论】:

  • 您还应该删除 this->x = key.x 等并将其替换为适当的成员初始化习惯用法 : Keyframebase(key), x(key.x) 等`。

标签: c++ c++11 inheritance copy-constructor


【解决方案1】:

所以这是给派生类对象的正确方法 基类的参数。

正确。

SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key)
   : Keyframebase( key )  ///<<< Call the base class copy constructor

【讨论】:

    【解决方案2】:

    这是将派生类对象作为参数提供给基类​​的正确方法吗

    是的。

    或者你可以申请explicitly-defaulted function definition这个案例,例如

    SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) = default;
    

    编译器生成的复制构造函数与

    做同样的事情
    SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase(key), 
                                                                x(key.x), 
                                                                y(key.y), 
                                                                z(key.z) 
    {}
    

    【讨论】:

      【解决方案3】:

      总之,是的。派生类应该必须处理复制基类属性的逻辑,但将该责任委托给基类,作为适当封装的行为。

      【讨论】:

        【解决方案4】:

        这是正确的方法吗

        确实如此。另请参阅 Effective C++ 中的第 12 条(“复制对象的所有部分”),其中作者给出了一个非常相似的示例。

        但是,请注意,如果可以的话,通常最好使用编译器生成的特殊成员函数的默认版本(假设 KeyframeType 是可复制的并且复制实例是正确的)。在你的情况下,似乎你可以。每当所有数据成员的成员副本都很好时,只需使用

        SumKeyframeXYZ(const SumKeyframeXYZ&) = default;
        

        在你的类定义中是要走的路。您也可以省略它,但rule of five 并不要求您明确说明您的特殊成员的defaultness,即所有成员(并且当您的virtual 析构函数在您的基类)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-07
          • 2013-06-23
          • 2011-10-10
          • 2018-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多