抽象类,复制构造函数

Abstract class, copy constructor

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

在具有纯虚方法的类中或仅在派生类中定义复制构造函数/操作符=有意义吗?

像普通类一样:是的,如果您有特定的实现需求。

如果它只有纯虚方法(没有数据成员),那么,不,合成的是好的(不会做任何事情)。

如果

确实有数据成员,那么您应该在必要时定义自己的复制构造函数,就像其他类一样。派生类与此没有太大关系。

如果它是一个你打算复制的对象,是的,这是个好主意。如果不是,请看下面我的评论。

如果您的虚拟基类依赖于需要显式分配和复制的资源(缓冲区,操作系统对象等),则定义复制构造函数可以省去在每个派生类中分别这样做的麻烦(此外,如果这些基资源是私有的,使用公共继承,则无法这样做)。

例如:

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

是的,你应该。
类的复制构造函数、复制赋值操作符和析构函数的实现规则甚至适用于抽象类。
还有,看一下"三原则"

这取决于你的用法,如果你不做任何需要小心处理的复制,例如复制句柄。如果需要,最好在派生类中定义复制构造函数。