Pourquoi l'amitié n'est-elle pas au moins éventuellement héritable en C ++? Je comprends que la transitivité et la réflexivité sont interdites pour des raisons évidentes (je dis cela uniquement pour éviter les réponses simples de citation de FAQ), mais l'absence de quelque chose du virtual friend class Foo;
genre me laisse perplexe. Quelqu'un connaît-il le contexte historique derrière cette décision? L'amitié était-elle vraiment juste un hack limité qui a depuis trouvé sa place dans quelques utilisations respectables obscures?
Modifier pour clarification: je parle du scénario suivant, pas où les enfants de A sont exposés à B ou à la fois à B et à ses enfants. Je peux également imaginer accorder éventuellement l'accès aux remplacements de fonctions d'amis, 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 le déclare Loki , l'effet peut être simulé plus ou moins en créant des fonctions proxy protégées dans des classes de base amies, il n'est donc pas nécessaire d'accorder une amitié à une classe ou à une méthode virtuelle. Je n'aime pas le besoin de procurations standard (ce 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 probablement temps d'acheter et de lire The Design and Evolution of C ++ de Stroupstrup , que j'ai vu assez de gens ici recommander, pour mieux comprendre ce type de questions ...