在具有纯虚方法的类中或仅在派生类中定义复制构造函数/ operator =是否有意义?
答案 0 :(得分:5)
与普通类一样:是的,如果您有特定的实现需求。
答案 1 :(得分:5)
如果它只有纯虚方法(并且没有数据成员)那么,不,合成的那个很好(并且不会做任何事情)。
如果确实有数据成员,那么你应该定义自己的复制构造函数,如果/这样做有意义,就像任何其他类一样。派生类与它没有多大关系。
答案 2 :(得分:2)
如果它是您计划复制的对象,是的,这是一个好主意。如果没有,请参阅下面的评论。
如果您的虚拟基类依赖于需要显式分配和复制的资源(缓冲区,操作系统对象等),那么定义复制构造函数可以省去在每个派生类中单独执行此操作的麻烦(另外,如果这些基础资源是私有的,使用公共继承,你不能做的事情。)
E.g:
class Base {
public:
Base( const Base & );
virtual ~Base();
virtual void Method() = 0;
// etc...
private:
int *memberIntArray;
int length;
// etc...
};
class DerivedOne : public Base{
public:
DerivedOne( const DerivedOne & );
virtual ~DerivedOne();
virtual void Method();
// etc...
protected:
// data, etc...
};
class DerivedTwo : public Base{
public:
DerivedTwo( const DerivedTwo & );
virtual ~DerivedTwo();
virtual void Method();
// etc...
protected:
// data, etc...
};
///////////////////
Base::Base( const Base & other ) {
this->length = other.length;
this->memberIntArray = new int[length];
memcpy(this->memberIntArray,other.memberIntArray,length);
}
//etc...
DerivedOne::DerivedOne( const DerivedOne & other )
: Base( other )
{
//etc...
}
DerivedTwo::DerivedTwo( const DerivedTwo & other )
: Base( other )
{
//etc...
}
答案 3 :(得分:0)
是的,你应该
为类创建复制构造函数,复制赋值运算符和析构函数的规则将适用于抽象类。
另外,请查看Rule of Three
答案 4 :(得分:0)
这取决于您的使用情况,如果您没有做任何需要复制以进行微妙处理的事情,例如:复制一个句柄。如果需要,最好在派生类中定义复制构造函数。