我正在寫一個抽象類,它將成爲其他幾個類的父類。我在想複製構造函數應該是私有的,因爲你使用的是抽象類,並且沒有什麼可以複製。但是,我不是100%肯定的。應該複製構造函數是私人的還是公開的
我是否正確,如果我不是爲什麼它應該公開或保護?
我正在寫一個抽象類,它將成爲其他幾個類的父類。我在想複製構造函數應該是私有的,因爲你使用的是抽象類,並且沒有什麼可以複製。但是,我不是100%肯定的。應該複製構造函數是私人的還是公開的
我是否正確,如果我不是爲什麼它應該公開或保護?
如果您不想複製類的對象,則複製構造函數應該是私有的。否則,它應該是公開的。
通過使複製構造函數爲私有,您將有助於防止意外的對象切片,在此創建派生類的副本但丟失該派生類的所有屬性。派生類可以使自己的拷貝構造函數公開並做正確的事情。
有一種情況,當抽象類有數據成員時,應該保護複製構造函數而不是私有的。這並不經常發生。基類可以複製基類成員,而派生類複製其自己的成員。
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;
};
你是對的!我認爲默認情況下調用基類複製構造函數。顯然你必須明確地稱它。真是個錯誤! – 2012-02-23 16:43:55
由於基類是抽象的而不能阻止切片? – 2012-02-23 17:18:58
@FredLarson,facepalm!當然,你不能實例化一個抽象類。 – 2012-02-23 17:20:59
我覺得protected
是最好的選擇:它的葉子上的對象是否是可複製的派生類的決定,同時禁止複製在抽象類級別,防止可怕的object slicing。
我認爲protected和private之間的區別在這種情況下是沒有意義的,因爲基類複製構造函數將是空的並且不需要被調用。 – 2012-02-23 16:59:50
@MarkRansom我認爲調用基類的拷貝構造函數是個好主意,即使你知道它確實是空的。只要基類中的拷貝構造函數保持爲空,編譯器就會優化它,但如果某人重構基類以包含非空副本構造函數,則派生類將不需要更改。 – dasblinkenlight 2012-02-23 17:06:43
非常好的一點。我編輯了自己的答案,以包含這種可能性。 – 2012-02-23 17:17:26
基類構造函數不可能創建派生類的副本,所以我不明白什麼時候它是公平的。 – 2012-02-23 16:48:42
@MarkRansom我的意思是[this](http://ideone.com/n2ndl),但人們仍然可以在派生類中實現複製構造函數。 – 2012-02-23 16:58:04
謝謝我這麼認爲。一個後續問題,因爲它是私有的並且永遠不會被使用,所以在複製構造器中不需要代碼,因爲它永遠不會被使用。那是對的嗎? – Aaron 2012-02-23 16:59:42