Por que o C ++ não permite amizade herdada?
Por que a amizade não é pelo menos opcionalmente herdável em C ++? Entendo que a transitividade e a reflexividade são proibidas por razões óbvias (digo isso apenas para evitar respostas simples para as perguntas frequentes), mas a falta de algo do tipovirtual friend class Foo;
me intriga. Alguém conhece o contexto histórico por trás dessa decisão? A amizade era realmente apenas um truque limitado que, desde então, chegou a alguns usos obscuros e respeitáveis?
Edite para esclarecimentos: Eu estou falando sobre o seguinte cenário,não onde os filhos de A são expostos a B ou a ambos e seus filhos. Também posso imaginar opcionalmente concedendo acesso a substituições de funções 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. */ };
Resposta aceita: ComoEstados de Loki, o efeito pode ser simulado mais ou menos criando funções de proxy protegidas em classes base amigas, para que não haja restriçõesnecessidade por conceder amizade a uma hierarquia de classe ou método virtual. Não gosto da necessidade de proxies clichê (que a base amiga se torna efetivamente), mas suponho que isso tenha sido considerado preferível a um mecanismo de linguagem que provavelmente seria mal utilizado na maioria das vezes. Acho que provavelmente é hora de comprar e ler o Stroupstrup'sO design e a evolução do C ++, que eu já vi muitas pessoas recomendarem aqui, para obter uma melhor compreensão desses tipos de perguntas ...