2013-01-17 20 views
9

Tôi là một người đam mê lập trình hướng đối tượng ở cấp độ mới bắt đầu. Tôi đã gặp phải câu đố sau:Tình bạn của lớp - một câu đố

class A { 
}; 

class B { 
protected: 
    friend class A; 
}; 

class C { 
public: 
    friend class B; 
}; 

Tham khảo mã mẫu ở trên, giả sử các lớp trên có thành viên dữ liệu, tên của thành viên C có thể được sử dụng trong khai báo của thành viên A?

  1. thành viên Chỉ riêng

  2. thành viên Chỉ bảo vệ

  3. Tất cả các thành viên dữ liệu C

  4. Chỉ thành viên nào

  5. Không ai trong số các thành viên dữ liệu C *

Lựa chọn của tôi là câu trả lời 4 vì tình bạn không phải là chuyển tiếp. Do đó, A là bạn của B, nhưng A không phải là bạn của C (mặc dù B là bạn của C). Đó có phải là suy nghĩ đúng không?

Ngoài ra, vấn đề của tôi là cho đến nay (trong hướng dẫn) Tôi đã gặp exmaples trong đó tình bạn được tuyên bố như thế này:

class X { 
public: 
    friend class Y; 
}; 

sự khác biệt nếu thay vì specifier nào chúng ta sử dụng là gì được bảo vệ? Như thế:

class X { 
protected: 
    friend class Y; 
}; 
+0

+1 cho câu hỏi được xây dựng tốt. – jrok

Trả lời

7
  1. Bạn là chính xác. Tình bạn không phải là quá độ cũng không phải là Thừa kế.
  2. Nó không tạo ra bất kỳ sự khác biệt nào theo thông số truy cập nào bạn đặt tờ khai friend.

Miễn là lớp học A chính nó không được khai báo là bạn của lớp C. Bạn không thể truy cập bất kỳ thành viên được bảo vệ hoặc riêng tư nào của C trong A.

+0

Cảm ơn bạn đã làm rõ – Prz3m3k