¿Por qué la amistad no es al menos opcionalmente heredable en C ++? Entiendo que la transitividad y la reflexividad están prohibidas por razones obvias (digo esto solo para evitar respuestas simples de citas de preguntas frecuentes), pero la falta de algo en la línea de virtual friend class Foo;
me desconcierta. ¿Alguien conoce los antecedentes históricos detrás de esta decisión? ¿Era la amistad realmente solo un truco limitado que desde entonces se ha abierto camino en algunos usos respetables oscuros?
Edite para aclarar: estoy hablando del siguiente escenario, no donde los hijos de A están expuestos a B o tanto a B como a sus hijos. También puedo imaginar la posibilidad de otorgar acceso a anulaciones de funciones de amigos, etc.
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. */ };
Respuesta aceptada: como dice Loki , el efecto se puede simular más o menos haciendo funciones proxy protegidas en clases base amigas, por lo que no hay una necesidad estricta de otorgar amistad a una jerarquía de clase o método virtual. No me gusta la necesidad de proxies repetitivos (en los que la base amiga se convierte efectivamente), pero supongo que esto se consideró preferible a un mecanismo de lenguaje que probablemente sería mal utilizado la mayor parte del tiempo. Creo que probablemente es hora de que compre y lea The Design and Evolution of C ++ de Stroupstrup , que he visto recomendar a suficientes personas aquí, para obtener una mejor comprensión de este tipo de preguntas ...