Mengapa persahabatan tidak paling tidak diwariskan secara opsional dalam C ++? Saya memahami transitivitas dan refleksivitas dilarang karena alasan yang jelas (saya mengatakan ini hanya untuk menghindari jawaban kutipan FAQ sederhana), tetapi kurangnya sesuatu di sepanjang garis virtual friend class Foo;
teka - teki saya. Adakah yang tahu latar belakang sejarah di balik keputusan ini? Apakah persahabatan benar-benar hanya peretasan terbatas yang sejak itu menemukan jalannya ke dalam beberapa kegunaan terhormat yang tidak jelas?
Edit untuk klarifikasi: Saya sedang berbicara tentang skenario berikut, bukan di mana anak-anak A terpapar pada B atau B dan anaknya. Saya juga dapat membayangkan secara opsional memberikan akses ke penggantian fungsi teman, dll.
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. */ };
Jawaban yang diterima: seperti yang dinyatakan Loki , efek dapat disimulasikan lebih atau kurang dengan membuat fungsi proxy yang dilindungi di kelas dasar yang bersahabat , jadi tidak ada kebutuhan yang ketat untuk memberikan pertemanan ke kelas atau metode virtual heirarki. Saya tidak menyukai kebutuhan akan proxy boilerplate (yang menjadi basis teman secara efektif), tetapi saya kira ini dianggap lebih disukai daripada mekanisme bahasa yang kemungkinan besar akan disalahgunakan sebagian besar waktu. Saya pikir mungkin sudah waktunya saya membeli dan membaca The Design and Evolution of C ++ dari Stroupstrup , yang saya rekomendasikan oleh cukup banyak orang di sini, untuk mendapatkan wawasan yang lebih baik tentang jenis pertanyaan ini ...