เหตุใดอย่างน้อยมิตรภาพจึงไม่สามารถสืบทอดได้ใน C ++? ฉันเข้าใจว่าการเคลื่อนย้ายและการสะท้อนกลับถูกห้ามด้วยเหตุผลที่ชัดเจน (ฉันพูดสิ่งนี้เพื่อตัดคำตอบของใบเสนอราคาคำถามที่พบบ่อยธรรมดา ๆ เท่านั้น) แต่ฉันขาดบางสิ่งบางอย่างตามแนวของvirtual friend class Foo;
ปริศนา มีใครทราบความเป็นมาทางประวัติศาสตร์เบื้องหลังการตัดสินใจครั้งนี้บ้าง? มิตรภาพเป็นเพียงการแฮ็คที่ จำกัด ซึ่งนับตั้งแต่นั้นมาก็กลายเป็นการใช้งานที่น่านับถือที่คลุมเครือไม่กี่อย่าง?
แก้ไขเพื่อความกระจ่าง:ฉันกำลังพูดถึงสถานการณ์ต่อไปนี้ไม่ใช่ที่ที่เด็กของ A สัมผัสกับ B หรือทั้ง B และลูก ๆ ของมัน ฉันยังสามารถจินตนาการได้ว่าการอนุญาตให้เข้าถึงการลบล้างฟังก์ชันของเพื่อนเป็นต้น
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. */ };
คำตอบที่ได้รับการยอมรับ:ในฐานะที่เป็นLokiสามารถจำลองเอฟเฟกต์ได้มากหรือน้อยโดยการสร้างฟังก์ชันพร็อกซีที่มีการป้องกันในคลาสพื้นฐานที่เป็นเพื่อนดังนั้นจึงไม่จำเป็นต้องเข้มงวดในการมอบมิตรภาพให้กับคลาสหรือวิธีการสืบสกุลเสมือน ฉันไม่ชอบความจำเป็นในการใช้พร็อกซีสำเร็จรูป (ซึ่งฐานที่เป็นเพื่อนกลายเป็นได้อย่างมีประสิทธิภาพ) แต่ฉันคิดว่าสิ่งนี้เป็นที่นิยมมากกว่ากลไกภาษาที่มักจะใช้ในทางที่ผิด ฉันคิดว่าคงถึงเวลาที่ฉันซื้อและอ่านThe Design and Evolution of C ++ของ Stroupstrup ซึ่งฉันเคยเห็นคนแนะนำมามากพอที่จะเข้าใจคำถามประเภทนี้ได้ดีขึ้น ...