2014-04-15 11 views
7

Tôi có lớp base chỉ chứa hàm tạo mặc định riêng và công thức sao chép đã xóa công khai và không có gì khác.Thừa kế từ một lớp có hàm tạo bản sao đã xóa

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

Nếu tôi cố gắng kế thừa từ base và tạo một thể hiện của lớp derived như dưới đây, g ++ 4.8.2 không biên dịch mã của tôi, nhưng VC++ 2013 không.

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

Vì vậy, có phải lỗi trong g ++ hoặc VC++ 2013 vừa bỏ qua điều gì đó?

Dưới đây là mã hoàn chỉnh ...

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

int main() { 
} 

... và thông điệp g ++ lỗi.

main.cpp:12:5: error: 'constexpr derived::derived()' is private 
    derived() = default; 
    ^
main.cpp:15:9: error: within this context 
derived x; 
     ^
main.cpp: In constructor 'constexpr derived::derived()': 
main.cpp:3:5: error: 'constexpr base::base()' is private 
    base() = default; 
    ^
main.cpp:12:5: error: within this context 
    derived() = default; 
    ^
main.cpp: At global scope: 
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here 
derived x; 
     ^
+8

Tôi cho rằng đó là lỗi trong VS2013. Hàm khởi tạo là riêng tư và do đó bạn không thể tạo một thể hiện của lớp. –

+0

Nhưng nếu lớp dẫn xuất không kế thừa từ lớp cơ sở, g ++ sẽ cho phép nó biên dịch. Có thể hàm tạo mặc định được đánh dấu mặc định giống như hàm tạo mặc định được khai báo ngầm định. – so61pi

+4

@ so61pi Thực tế là g + + sẽ không chẩn đoán trường hợp đó là [GCC bug 56429] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429). – Casey

Trả lời

5

Bạn đang hiểu sai lỗi, nó được nói với bạn rằng các nhà xây dựng mặc định cho derived không thể truy cập (là private) để bạn không thể sử dụng để tạo ra một đối tượng của loại đó. Bây giờ, hãy làm cho nó public ở cấp derived sẽ không giúp ích gì, vì hàm tạo base cũng là private và do đó không thể được sử dụng trong hàm tạo của derived.

Tại sao bạn muốn các nhà thầu đó là private?

+0

Tôi vừa thử nghiệm một số tính năng C++ 11 sử dụng VC++ 2013 & g ++: D. – so61pi

Các vấn đề liên quan