Tại sao tình bạn ít nhất không phải là tùy chọn có thể kế thừa trong C ++? Tôi hiểu tính nhạy cảm và phản xạ bị cấm vì những lý do rõ ràng (tôi nói điều này chỉ để bắt đầu câu trả lời trích dẫn câu hỏi thường gặp đơn giản), nhưng thiếu một cái gì đó dọc theo dòng virtual friend class Foo;
câu hỏi của tôi. Có ai biết bối cảnh lịch sử đằng sau quyết định này không? Liệu tình bạn có thực sự chỉ là một sự tấn công có giới hạn mà từ đó nó đã được tìm thấy để trở thành một vài công dụng đáng nể?
Chỉnh sửa để làm rõ hơn: Tôi đang nói về tình huống sau đây, không phải trường hợp con cái của A được tiếp xúc với B hoặc với cả B và con của nó. Tôi cũng có thể tưởng tượng việc cấp quyền truy cập tùy chọn cho các ghi đè của các chức năng bạn bè, v.v.
class A {
int x;
friend class B;
};
class B {
// OK as per friend declaration above.
void foo(A& a, int n) { a.x = n; }
};
class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };
Câu trả lời được chấp nhận: như Loki nói , hiệu ứng có thể được mô phỏng ít nhiều bằng cách tạo các hàm proxy được bảo vệ trong các lớp cơ sở kết bạn, vì vậy không cần nghiêm ngặt để cấp tình bạn cho một lớp hoặc hệ thống phương thức ảo. Tôi không thích sự cần thiết của các proxy soạn sẵn (mà cơ sở kết bạn sẽ trở thành một cách hiệu quả), nhưng tôi cho rằng điều này được cho là thích hợp hơn một cơ chế ngôn ngữ có nhiều khả năng bị lạm dụng trong hầu hết thời gian. Tôi nghĩ có lẽ đã đến lúc tôi mua và đọc The Design and Evolution of C ++ của Stroupstrup , cuốn sách mà tôi đã thấy đủ người ở đây giới thiệu, để có cái nhìn sâu sắc hơn về những loại câu hỏi này ...