Warum ist Freundschaft in C ++ nicht zumindest optional vererbbar? Ich verstehe, dass Transitivität und Reflexivität aus offensichtlichen Gründen verboten sind (ich sage dies nur, um einfache Antworten auf häufig gestellte Fragen zu vermeiden), aber das Fehlen von etwas in der Art von virtual friend class Foo;
Rätseln verwirrt mich. Kennt jemand den historischen Hintergrund dieser Entscheidung? War Freundschaft wirklich nur ein begrenzter Hack, der seitdem seinen Weg in ein paar obskure, respektable Zwecke gefunden hat?
Zur Verdeutlichung bearbeiten: Ich spreche über das folgende Szenario, nicht wenn Kinder von A entweder B oder sowohl B als auch seinen Kindern ausgesetzt sind. Ich kann mir auch vorstellen, optional Zugriff auf Überschreibungen von Freundfunktionen usw. zu gewähren.
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. */ };
Akzeptierte Antwort: Wie Loki feststellt, kann der Effekt mehr oder weniger simuliert werden, indem geschützte Proxy-Funktionen in befreundeten Basisklassen ausgeführt werden. Daher besteht keine strikte Notwendigkeit , einer Klassen- oder virtuellen Methodenerbschaft Freundschaft zu gewähren. Ich mag die Notwendigkeit von Boilerplate-Proxys (die die befreundete Basis effektiv wird) nicht, aber ich nehme an, dass dies einem Sprachmechanismus vorzuziehen war, der mit größerer Wahrscheinlichkeit die meiste Zeit missbraucht wird. Ich denke, es ist wahrscheinlich an der Zeit, Stroupstrups The Design and Evolution of C ++ zu kaufen und zu lesen , das ich hier genug empfohlen habe, um einen besseren Einblick in diese Art von Fragen zu erhalten ...