派生类的复制构造函数

5

我有一个基类。

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

由于我想在复制派生类对象时也复制基类成员,所以将派生类对象作为参数传递给基类是否是正确的方法。


2
你还应该删除 this->x = key.x 等语句,并用适当的成员初始化习惯用法 : Keyframebase(key), x(key.x) 进行替换。 - n. m.
4个回答

4
这是给基类传递派生类对象的正确方式。
SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key)
   : Keyframebase( key )  ///<<< Call the base class copy constructor

4

将派生类对象作为基类参数传递的方法是否正确?

是的,这样做是正确的。

或者您可以为此情况应用显式默认函数定义,例如:

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

编译器生成的复制构造函数执行与以下代码相同的操作:
SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase(key), 
                                                            x(key.x), 
                                                            y(key.y), 
                                                            z(key.z) 
{}

2

简而言之,是的。派生类应该处理复制基类属性的逻辑,但作为适当封装的一种形式,将该责任委托给基类。

最初的回答:


2
这是正确的方法吗?这有点正确。请参考Effective C++中的第12项(“复制对象的所有部分”),其中作者给出了一个非常相似的例子。
但是,请注意,如果可以的话,最好使用编译器生成的特殊成员函数的默认版本(假设KeyframeType是可复制的,并且复制实例会产生正确的结果)。在您的情况下,似乎可以这样做。每当所有数据成员的成员逐一复制都可以时,只需进行简单的复制即可。
SumKeyframeXYZ(const SumKeyframeXYZ&) = default;

在你的类定义中使用这种方式是可行的。你也可以省略它,但要注意五个规则实际上要求你明确指定特殊成员函数的默认性质,即所有特殊成员函数(如果你的基类有虚析构函数,则该规则适用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接