抽象类,复制构造函数

Joh*_*hny 4 c++ abstract-class copy-constructor

在具有纯虚方法的类中或仅在派生类中定义复制构造函数/ operator =是否有意义?

jus*_*tin 5

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


Nat*_*ate 5

如果它是您计划复制的对象,是的,这是一个好主意。如果不是,请参阅下面的评论。

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

例如:

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...
}
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我更喜欢为所有内容声明私有的空复制构造函数和赋值运算符。这样,如果我试图不恰当地复制某些内容,编译器就会抱怨。只有当我真的*需要*一个可复制的对象时,我才会公开其中的任何一个。读到这里你可能会笑,但是当我开始练习时,你会惊讶地发现有多少问题被解决了。;) (7认同)

Lig*_*ica 5

如果它只有纯虚方法(并且没有数据成员)那么,不,合成的一个很好(并且不会做任何事情).

如果它确实有数据成员那么你应该定义你自己的复制构造函数if/when什么时候这样做,就像任何其他类一样.派生类与它没有多大关系.