2011-11-04 29 views
14

g++ từ chối tôi truy cập vào một loại, chỉ vì nó xảy ra là một người cha riêng tư. Điều này có nghĩa không?Loại không thể tiếp cận do thừa kế riêng

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(A const& a) {} 
}; 

Biên soạn sản lượng này:

1:10: error: ‘struct A A::A’ is inaccessible 
6:12: error: within this context 

Quan điểm của tôi là: Tôi không bao giờ muốn để truy cập A như một tổ tiên. Trên thực tế, nếu A là tổ tiên riêng của B, điều này không nên hoàn toàn ẩn đối với bất kỳ ai trừ B (ví dụ: C)?

Tất nhiên, tôi có thể sử dụng thừa kế protected nhưng trong trường hợp của tôi, điều đó thực sự không có ý nghĩa.

Trả lời

13

Điều này là do tên lớp được tiêm từ A ẩn toàn cầu A bên trong C. Mặc dù A hiển thị, nó không thể truy cập được (vì nó được nhập dưới dạng riêng tư), do đó có lỗi. Bạn có thể truy cập A bằng cách tìm kiếm nó trong không gian tên chung:

void foo(::A const& a) {} 
8

nếu bạn khai báo nó như sau nó hoạt động

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(::A const& a) {} 
}; 

Các lỗi cái thấy của mình là làm gì để phân giải tên không thể truy cập. Các :: A nói nhìn vào không gian tên toàn cầu không phải là loại lớp lồng nhau được thừa hưởng của tôi. Cũng nên nhớ rằng thừa kế riêng chỉ là nói B có A và IMOHO là một tính năng ngôn ngữ ngu ngốc nên tránh.

+1

Nó không phải là một tính năng ngu ngốc chút nào; nó cho phép người dùng hạn chế giao diện được kế thừa bằng cách chọn riêng các hàm để lộ ra bằng 'using'. – avakar

+2

Bạn có thể làm gì với các chức năng giao nhận với tính năng ra ngoài và làm cho mô hình kế thừa C++ ít lộn xộn hơn. thừa kế riêng không thừa kế thành phần của nó và sử dụng cùng ngữ nghĩa để hoàn thành hai khái niệm riêng biệt chỉ gây nhầm lẫn. – rerun

+2

Đó là sự khác biệt giữa thành phần và thừa kế riêng, bởi vì sau này cho phép bạn truy cập vào các thành viên được bảo vệ của cha bạn trong khi người cũ không. – bitmask

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