¿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 (lo digo solo para evitar las respuestas a las preguntas frecuentes), pero la falta de algo en el sentido de virtual friend class Foo;
me deja perplejo. ¿Alguien conoce los antecedentes históricos detrás de esta decisión? ¿La amistad realmente era solo un truco limitado que desde entonces ha encontrado su camino en algunos oscuros y respetables usos?¿Por qué C++ no permite la amistad heredada?
Editar una aclaración: que estoy hablando el siguiente escenario, no donde los niños de A están expuestos a cualquiera de B o B y sus hijos. También puedo imaginar concesión opcionalmente el acceso a las anulaciones de funciones friend, 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 Loki states, el efecto puede ser simulado más o menos haciendo funciones de proxy protegidas en clases base friended, así que hay no es estricto necesita para otorgar amistad a una jerarquía de clase o método virtual. No me gusta la necesidad de proxies repetitivos (que la base de amigos se convierte en realidad), 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 es probable que sea hora de que compre y lea Stroupstrup's The Design and Evolution of C++, que he visto suficientes personas aquí, para obtener una mejor comprensión de este tipo de preguntas ...
Bingo. Se trata de limitar el daño que puedes causar cambiando las partes internas de una clase. –
Francamente, el caso en el que realmente estoy pensando es en el patrón de abogado-cliente, donde un intermediario actúa como una interfaz limitada para las clases externas al presentar los métodos de contenedor a la clase subyacente de acceso restringido. Decir que una interfaz está disponible para todos los niños de otras clases en lugar de una clase exacta sería mucho más útil que el sistema en la actualidad. – Jeff
@Jeff: http://www.drdobbs.com/184402053 –