复制派生类的构造方法

时间:2019-07-24 06:41:30

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

我有一个基类

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;
       } 

由于我想在复制派生类的对象时也要复制基类成员,因此这是将派生类对象作为基类参数的正确方法。

4 个答案:

答案 0 :(得分:5)

  

这是将派生类对象赋予为的正确方法吗   基类的参数。

正确。

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

答案 1 :(得分:4)

  

这是将派生类对象作为基类参数的正确方法

是的。

或者您可以在这种情况下应用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) 
{}

答案 2 :(得分:3)

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

答案 3 :(得分:3)

  

这是正确的方法

有点。另请参见有效C ++中的第12项(“复制对象的所有部分”),作者在其中给出了一个非常相似的示例。

但是,请注意,如果可以的话,通常最好使用编译器生成的特殊成员函数的默认版本(假设KeyframeType是可复制的,并且复制实例是正确的事情)。就您而言,似乎可以。只要所有数据成员的成员级副本都可以,只需使用

SumKeyframeXYZ(const SumKeyframeXYZ&) = default;
在类定义中的

是可行的方法。您也可以忽略它,但不是rule of five实际上要求您明确说明特殊成员的default身份,即所有成员(并且在您拥有{{ 1}}基类中的析构函数。