繁体   English   中英

抽象类,复制构造函数

[英]Abstract class, copy constructor

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

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

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

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

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

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

例如:

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

是的你应该。
为类创建复制构造函数,复制赋值运算符和析构函数的规则将适用于抽象类。
另外,看一下三级规则

这取决于您的使用情况,如果您没有做任何需要复制以微妙处理的事情,例如复制手柄。 如果需要,最好在派生类中定义复制构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM