![](/img/trans.png)
[英]Should the deleted default constructor be in Public or Private?
[英]Should copy constructor be private or public
我正在編寫一個抽象類,它將成為其他幾個類的父類。 我認為復制構造函數應該是私有的,因為你使用的是抽象類,沒有什么可以復制的。 但是,我不是100%肯定。
我是否正確,如果我不是為什么要公開或受到保護?
如果您不希望復制類的對象,則復制構造函數應該是私有的。 否則,它應該是公開的。
我認為protected
是最好的選擇:它決定對象是否可以復制到派生類,同時禁止在抽象類級別進行復制,防止可怕的對象切片 。
通過將復制構造函數設置為私有,您將有助於防止無意中的對象切片,其中您創建派生類的副本但會丟失該派生類的所有屬性。 派生類可以創建自己的公共副本構造函數並做正確的事情。
當抽象類具有數據成員時,有一種情況應該保護復制構造函數而不是私有。 這種情況不會經常發生。 基類可以復制基類成員,而派生類復制自己的成員。
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;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.