2013-03-18 101 views
9

我想使抽象基類不可複製,並強制從它派生的任何類都是不可複製的。下面的代碼使用noncopyable.hpp中定義的Boost的不可複製性,但仍然允許派生類D定義複製構造函數。禁止在繼承類中定義拷貝構造函數

class noncopyable 
{ 
    protected: 
     noncopyable() {} 
     ~noncopyable() {} 
    private: // emphasize the following members are private 
     noncopyable(const noncopyable&); 
     const noncopyable& operator=(const noncopyable&); 
}; 

class D : noncopyable 
{ 
    public: 
     D() { } 
     D(const D&) { } 
}; 

int main() 
{ 
    D a; 
    D b(a); 

    return 0; 
} 

此代碼可以編譯和運行(http://ideone.com/g4gGLm),當我希望它拋出約D的拷貝構造函數編譯時錯誤。也許我錯誤地解釋了這個不可複製的類是做什麼的。如果是這樣,有沒有辦法強制派生類不定義複製構造函數? (答案可以使用C++ 11,但最好不要增加)

回答

3

您需要刪除D的拷貝構造函數。現在您可以通過不嘗試複製構建基類來允許D的拷貝構造。以下變體將無法編譯:

class E: noncopyable 
{ 
}; 
E e, e2(e); 

class F: noncopyable 
{ 
public: 
    F(const F &init): noncopyable(init) 
    {} 
}; 
+0

我現在明白了非拷貝是什麼(謝謝你的E類例子)。謝謝 – steve9164 2013-03-27 10:52:08

12

這個原因是因爲D(const D&)調用基類的默認構造函數,而不是複製構造函數。 (反直覺在第一,但它是有道理考慮所有構造這樣的表現)

由於拷貝構造函數不叫,不創建基本對象的副本,除非你明確要求之一:

D(const D& d) : noncopyable(d) { } 

這確實會導致錯誤。所以事實上,你的問題是一個沒有問題 - 沒有複製noncopyable正在進行。

我不知道任何直接的方法來強制派生類不允許複製,也不建議使用一個如果有的話。

+0

爲什麼您不建議禁止複製? – steve9164 2013-03-18 11:48:48

+1

@ steve9164並不是這麼說的 - 我不建議編寫不可讀的代碼,只是爲了強制派生類禁止複製。 – 2013-03-18 12:03:43

+0

如果生成的代碼是不可讀的,那麼是的,我同意它可能不值得的 – steve9164 2013-03-18 12:09:02