提问人: 提问时间:7/24/2019 最后编辑:Mureinik 更新时间:7/24/2019 访问量:2478
复制派生类的构造函数
Copy Constructor for derived class
问:
我有一个基类
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赞
robthebloke
7/24/2019
#1
那么,这是将派生类对象指定为 基类的参数。
正确。
SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key)
: Keyframebase( key ) ///<<< Call the base class copy constructor
2赞
Mureinik
7/24/2019
#2
一句话,是的。派生类应该处理复制基类属性的逻辑,但将该责任委托给基类,作为适当的封装行为。
2赞
lubgr
7/24/2019
#3
那么这是正确的方法吗?
有点像。另请参阅有效 C++ 中的第 12 项(“复制对象的所有部分”),作者给出了一个非常相似的例子。
但是,请注意,如果可以的话,通常最好使用编译器生成的特殊成员函数的默认版本(假设是可复制的,并且复制实例可以做正确的事情)。就您而言,您似乎可以。每当所有数据成员的成员副本都可以时,只需使用KeyframeType
SumKeyframeXYZ(const SumKeyframeXYZ&) = default;
在你的类定义中是要走的路。你也可以省略它,但并不是说五法则实际上要求你明确你的特殊成员,即所有成员(当你的基类中有一个析构函数时,它就会启动)。default
virtual
4赞
songyuanyao
7/24/2019
#4
这是将派生类对象作为基类参数的正确方法吗
是的,它是。
或者,您可以对这种情况应用显式默认的函数定义,例如
SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) = default;
编译器生成的复制构造函数执行与
SumKeyframeXYZ::SumKeyframeXYZ(const SumKeyframeXYZ& key) : Keyframebase(key),
x(key.x),
y(key.y),
z(key.z)
{}
评论
this->x = key.x
: Keyframebase(key), x(key.x)