【发布时间】:2012-03-14 02:25:49
【问题描述】:
我正在编写一个抽象类,它将成为其他几个类的父类。我认为应该将复制构造函数设为私有,因为您使用的是抽象类并且没有什么可复制的。但是,我不是 100% 确定。
我是否正确,如果我不正确,为什么要公开或保护它?
【问题讨论】:
标签: c++ private copy-constructor public
我正在编写一个抽象类,它将成为其他几个类的父类。我认为应该将复制构造函数设为私有,因为您使用的是抽象类并且没有什么可复制的。但是,我不是 100% 确定。
我是否正确,如果我不正确,为什么要公开或保护它?
【问题讨论】:
标签: c++ private copy-constructor public
通过将复制构造函数设为私有,您将有助于防止意外的对象切片,即复制派生类但会丢失该派生类的所有属性。派生类可以创建自己的复制构造函数,这些构造函数是公共的并且可以做正确的事情。
当抽象类有数据成员时,复制构造函数应该被保护而不是私有的一种情况。这并不经常发生。基类可以复制基类成员,而派生类复制自己的成员。
class AbstractBase
{
public:
AbstractBase(const std::string &init) : wtf(init) {}
virtual ~AbstractBase() {}
void DoSomething() = 0;
protected:
AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}
const std::string wtf;
};
class Derived : public AbstractBase
{
public:
// ...
Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
int moredata;
};
【讨论】:
如果您不想复制类的对象,则复制构造函数应该是私有的。否则,它应该是公开的。
【讨论】:
我认为protected 是最好的选择:它将决定对象是否可复制到派生类,同时禁止在抽象类级别复制,防止可怕的object slicing。
【讨论】: