抽象类,复制构造函数
Abstract class, copy constructor
在具有纯虚方法的类中或仅在派生类中定义复制构造函数/操作符=有意义吗?
像普通类一样:是的,如果您有特定的实现需求。
如果它只有纯虚方法(没有数据成员),那么,不,合成的是好的(不会做任何事情)。
如果确实有数据成员,那么您应该在必要时定义自己的复制构造函数,就像其他类一样。派生类与此没有太大关系。
如果它是一个你打算复制的对象,是的,这是个好主意。如果不是,请看下面我的评论。
如果您的虚拟基类依赖于需要显式分配和复制的资源(缓冲区,操作系统对象等),则定义复制构造函数可以省去在每个派生类中分别这样做的麻烦(此外,如果这些基资源是私有的,使用公共继承,则无法这样做)。
例如:
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...
}
是的,你应该。
类的复制构造函数、复制赋值操作符和析构函数的实现规则甚至适用于抽象类。
还有,看一下"三原则"
这取决于你的用法,如果你不做任何需要小心处理的复制,例如复制句柄。如果需要,最好在派生类中定义复制构造函数。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类