Por que a amizade não é pelo menos opcionalmente herdada em C ++? Eu entendo que a transitividade e a reflexividade são proibidas por razões óbvias (digo isso apenas para evitar respostas simples de citação do FAQ), mas a falta de algo parecido com o que virtual friend class Foo;
me intriga. Alguém conhece os antecedentes históricos por trás dessa decisão? A amizade era realmente apenas um hack limitado que desde então encontrou seu caminho para alguns usos obscuros e respeitáveis?
Edite para esclarecimento: estou falando sobre o seguinte cenário, não onde os filhos de A são expostos a B ou a B e seus filhos. Também posso imaginar a concessão de acesso opcional para substituições de funções de amigo, 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: como afirma Loki , o efeito pode ser simulado mais ou menos criando funções de proxy protegidas em classes base amigas, portanto, não há necessidade estrita de conceder amizade a uma classe ou hierarquia de método virtual. Não gosto da necessidade de proxies clichê (que a base de amigos efetivamente se torna), mas suponho que isso foi 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 The Design and Evolution of C ++ , de Stroupstrup , que já vi muitas pessoas recomendarem, para ter uma visão melhor sobre esses tipos de perguntas ...