派生类的复制构造函数

Copy Constructor for derived class

本文关键字:构造函数 复制 派生      更新时间:2023-10-16

我有一个基类

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

这是派生类的复制构造函数。

SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase( 
 key )
       {
        this->x = key.x;
        this->y = key.y;
        this->z = key.z;
       } 
由于我在复制派生类

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

那么这是将派生类对象作为 基类的参数。

正确。

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

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

是的,它是。

或者,您可以在这种情况下应用显式默认的函数定义,例如

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

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

SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase(key), 
                                                            x(key.x), 
                                                            y(key.y), 
                                                            z(key.z) 
{}

一句话,是的。派生类应该必须处理复制基类属性的逻辑,但将该责任委托给基类,作为正确封装的行为。

那么这是正确的方法

有点像。另见有效C++中的第12项("复制对象的所有部分"(,作者给出了一个非常相似的例子。

但是,请注意,如果可以的话,通常最好使用编译器生成的特殊成员函数的默认版本(假设KeyframeType是可复制的,并且复制实例可以执行正确的操作(。就你而言,你似乎可以。每当所有数据成员的成员按成员复制时,只需使用

SumKeyframeXYZ(const SumKeyframeXYZ&) = default;

在你的类定义是要走的路。你也可以省略它,但并不是说五法则实际上要求你明确你的特殊成员的default性,即所有成员(当你的基类中有一个virtual析构函数时,它就会启动(。