Dlaczego przyjaźń nie jest przynajmniej opcjonalnie dziedziczona w C ++? Rozumiem, że przechodniość i refleksyjność są zabronione z oczywistych powodów (mówię to tylko po to, by odrzucić proste odpowiedzi na FAQ), ale brak czegoś w rodzaju virtual friend class Foo;
zagadek mnie zaskakuje. Czy ktoś zna historyczne tło tej decyzji? Czy przyjaźń naprawdę była tylko ograniczonym hackiem, który od tamtej pory znalazł zastosowanie w kilku niejasnych, szanowanych zastosowaniach?
Edytuj dla wyjaśnienia: mówię o następującym scenariuszu, a nie o sytuacji, w której dzieci A są narażone na B lub zarówno B, jak i jego dzieci. Mogę sobie również wyobrazić opcjonalne przyznanie dostępu do nadpisań funkcji znajomych itp.
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. */ };
Zaakceptowana odpowiedź: jak stwierdza Loki , efekt można symulować mniej więcej przez tworzenie chronionych funkcji proxy w zaprzyjaźnionych klasach bazowych, więc nie ma ścisłej potrzeby przyznawania przyjaźni z dziedziczeniem klas lub metod wirtualnych. Nie podoba mi się potrzeba używania standardowych serwerów proxy (którymi faktycznie staje się zaprzyjaźniona baza), ale przypuszczam, że uznano to za lepsze od mechanizmu językowego, który byłby częściej nadużywany przez większość czasu. Myślę, że nadszedł czas, abym kupił i przeczytał książkę Stroupstrup The Design and Evolution of C ++ , którą poleca wystarczająco dużo osób, aby uzyskać lepszy wgląd w tego typu pytania ...