2016-06-14 55 views
1

刪除父在父類後孩子複製c'tor我:實現在CPP

Parent(const Parent& p) = delete; 

我想繼承到子類,並在類中我想使用默認的複製c 「做TOR:

Child(const Child& c) = default; 

但是我得到一個錯誤:"use of deleted function Parent(const Parent&)"

我爲什麼不能創建默認c'tor,是有辦法解決? 謝謝!

+0

一個簡單的解決方法是將父副本ctor聲明爲protected而不是刪除。 – Dani

+5

聽起來像我可疑的設計。如果不能複製父母,什麼時候能夠複製孩子? –

+1

爲什麼父母不能有抄送員有充足的理由嗎?它是否包含無法複製的內容?如果沒有,你不應該刪除複製ctor。但是如果存在這樣的原因,那麼你可以寫'Child(const Child&c):Parent(){}'。它會爲複製的孩子構建一個新的父母,但它當然不會複製父母的數據。 – HolyBlackCat

回答

3

錯誤消息的原因是默認的拷貝構造函數調用基類的拷貝構造函數。由於被刪除,編譯器無法生成複製構造函數。解決方案是爲派生類編寫自己的拷貝構造函數,並且做任何你認爲有意義的構造基類對象的「拷貝」。

+0

哎呀,我的壞。你完全正確。 – HolyBlackCat

2

派生類中會調用拷貝構造函數的基類的......

引用C++標準草案的相關部分的拷貝構造函數的默認實現... 部分這裏轉載:

[class.copy]

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 */ 
    { 
     ..... 
    } 
}; 
+0

Ctor初始化列表*必須*包含父項,但它必須調用與複製ctor不同的東西,不是嗎? – HolyBlackCat

+0

@HolyBlackCat,是的..你是對的..例子[here](http://coliru.stacked-crooked.com/a/978bb0152950ec8f) – WhiZTiM