Pourquoi l'amitié n'est pas au moins optionnellement héritable en C++ ? Je comprends que la transitivité et la réflexivité soient interdites pour des raisons évidentes (je dis cela uniquement pour éviter les réponses simples de type FAQ), mais l'absence de quelque chose du type virtual friend class Foo;
me laisse perplexe. Quelqu'un connaît-il le contexte historique de cette décision ? L'amitié n'était-elle vraiment qu'un hack limité qui a depuis trouvé sa place dans quelques utilisations obscures et respectables ?
Editer pour clarification : Je parle du scénario suivant, no où les enfants de A sont exposés soit à B, soit à B et à ses enfants. Je peux aussi imaginer d'accorder facultativement l'accès aux surcharges des fonctions amies, 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. */ };
Réponse acceptée : comme Loki déclare l'effet peut être plus ou moins simulé en créant des fonctions proxy protégées dans les classes de base amies, de sorte qu'il n'y a pas d'obligation stricte d'utiliser des fonctions proxy. besoin de pour accorder l'amitié à une classe ou à une hiérarchie de méthodes virtuelles. Je n'aime pas le besoin de proxies passe-partout (que la base amie devient effectivement), mais je suppose que cela a été jugé préférable à un mécanisme de langage qui serait plus probablement mal utilisé la plupart du temps. Je pense qu'il est temps que j'achète et lise l'ouvrage de Stroupstrup. La conception et l'évolution du C++ que j'ai vu suffisamment de personnes ici recommander, pour avoir un meilleur aperçu de ce type de questions ...