2011-04-08 211 views

回答

5

像正常的类:是的,如果你有一个具体的实施需求。

2

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

如果您的虚拟基类依赖于需要显式分配和复制的资源(缓冲区,操作系统对象等),那么定义复制构造函数可以避免在每个派生类中分别执行此操作的麻烦(并且,另外,如果这些基础资源是私有的,则使用公有继承)。

例如为:

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

我只是补充说应该使用一个拷贝构造函数来重载=操作符。它提高了可读性,并且不易出错。 – janhink 2011-04-08 09:41:58

+5

我真的很喜欢将私有空副本构造函数和赋值运算符声明为一切。这样,如果我试图不恰当地复制某些内容,编译器会抱怨。只有当我确实需要*可复制的对象时,我才会公开这些内容。你可能会开怀大笑,但是当我开始练习时,你会惊讶地发现有多少问题得到解决。 ;) – Nate 2011-04-08 09:55:28

0

是的,你应该。
即使是抽象类也适用于您为自己的复制构造函数,复制赋值运算符和析构函数实现的规则。
另外,看看Rule of Three

0

这取决于你的使用情况,如果你没有做任何事情需要复制处理,例如,复制句柄。如果需要,你最好在派生类中定义一个拷贝构造函数。

4

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

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