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 ...

questionAnswers(10)

yourAnswerToTheQuestion