刪除父在父類後孩子複製c'tor我:實現在CPP
Parent(const Parent& p) = delete;
我想繼承到子類,並在類中我想使用默認的複製c 「做TOR:
Child(const Child& c) = default;
但是我得到一個錯誤:"use of deleted function Parent(const Parent&)"
我爲什麼不能創建默認c'tor,是有辦法解決? 謝謝!
刪除父在父類後孩子複製c'tor我:實現在CPP
Parent(const Parent& p) = delete;
我想繼承到子類,並在類中我想使用默認的複製c 「做TOR:
Child(const Child& c) = default;
但是我得到一個錯誤:"use of deleted function Parent(const Parent&)"
我爲什麼不能創建默認c'tor,是有辦法解決? 謝謝!
錯誤消息的原因是默認的拷貝構造函數調用基類的拷貝構造函數。由於被刪除,編譯器無法生成複製構造函數。解決方案是爲派生類編寫自己的拷貝構造函數,並且做任何你認爲有意義的構造基類對象的「拷貝」。
哎呀,我的壞。你完全正確。 – HolyBlackCat
派生類中會調用拷貝構造函數的基類的......
引用C++標準草案的相關部分的拷貝構造函數的默認實現... 部分這裏轉載:
13. A copy/move constructor that is defaulted and not defined as deleted is implicitly defined if it is odr-used ([basic.def.odr]) or when it is explicitly defaulted after its first declaration.
而且
14. The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. ....
所以,你最好打賭是手動定義基類的複製構造函數。但它通常不是一個好的設計來規避父類的複製構造函數。
class Parent{
public:
.....
Parent(const Parent&) = delete;
};
class Child : public Parent {
public:
.....
Child(const Child&) /* use c'tor init list here except for base class */
{
.....
}
};
Ctor初始化列表*必須*包含父項,但它必須調用與複製ctor不同的東西,不是嗎? – HolyBlackCat
@HolyBlackCat,是的..你是對的..例子[here](http://coliru.stacked-crooked.com/a/978bb0152950ec8f) – WhiZTiM
一個簡單的解決方法是將父副本ctor聲明爲protected而不是刪除。 – Dani
聽起來像我可疑的設計。如果不能複製父母,什麼時候能夠複製孩子? –
爲什麼父母不能有抄送員有充足的理由嗎?它是否包含無法複製的內容?如果沒有,你不應該刪除複製ctor。但是如果存在這樣的原因,那麼你可以寫'Child(const Child&c):Parent(){}'。它會爲複製的孩子構建一個新的父母,但它當然不會複製父母的數據。 – HolyBlackCat