2017-11-27 63 views
10

Tôi đang học C++. Tài liệu hướng dẫn docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp nói:Truy cập các thành viên tĩnh công khai của một lớp cơ sở được chỉ định là riêng tư

Khi bạn chỉ định một lớp cơ sở là riêng tư, nó chỉ ảnh hưởng đến các thành viên không có tính chất. Các thành viên tĩnh công cộng vẫn có thể truy cập được trong các lớp dẫn xuất.

Tuy nhiên, đoạn mã sau hơi điều chỉnh từ ví dụ sau quote nguyên nhân lỗi C2247 trước:

'cơ sở :: y' không thể truy cập vì 'Derived1' sử dụng 'tư nhân' kế thừa từ ' Căn cứ'.

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào về tình huống này.

class Base 
{ 
public: 
    int x;    
    static int y;  
}; 

class Derived1 : private Base 
{ 
}; 

class Derived2 : public Derived1 
{ 
public: 
    int ShowCount();  
}; 

int Derived2::ShowCount() 
{ 
    int cCount = Base::y;  
    return cCount; 
} 
+2

Sử dụng ':: Base :: y' để nhận đúng phạm vi. – Peter

+1

Tôi nghĩ rằng ví dụ của Microsoft bị hỏng. – molbdnilo

Trả lời

15

Tài liệu đó có chút gây hiểu lầm.

Các hành vi biên dịch đúng là dành cho Base::yBase::x để cả không thể tiếp cận trong Derived, nếu bạn sử dụng ký hiệu đó để cố gắng đạt được static thành viên.

Nhưng bạn thể đạt được nó thông qua namespace toàn cục (do đó phá vỡ Derived1) bằng cách sử dụng một toán tử có độ phân giải phạm vi:

int Derived2::ShowCount() 
{ 
    int cCount = ::Base::y;  
    return cCount; 
} 

Cuối cùng, đừng quên xác địnhy đâu đó nếu bạn muốn giai đoạn liên kết thành công.

+4

Việc tìm đường dẫn của các quy tắc tra cứu tên là rất bực bội ở lần. – StoryTeller

+1

@Bathsheba Bạn cũng có thể vui lòng thêm giải thích về lý do tại sao thêm độ phân giải phạm vi khác hoạt động trong ví dụ trên. Nó sẽ rất hữu ích cho tôi. Cảm ơn! –

+1

@PravarJawalekar: Tôi đã thêm điều đó. Không chính thức, nếu bạn đi qua không gian tên * toàn cục *, thì bạn tiếp cận trực tiếp 'Base' thay vì đi qua' Derived1'. – Bathsheba

2

Thay đổi này:

Base::y; 

này;

::Base::y; 
Các vấn đề liên quan