Perché l'amicizia non è almeno facoltativamente ereditabile in C ++? Capisco che la transitività e la riflessività siano proibite per ovvie ragioni (lo dico solo per evitare semplici risposte alle domande frequenti), ma la mancanza di qualcosa sulla falsariga di virtual friend class Foo;
me mi lascia perplesso. Qualcuno conosce il contesto storico dietro questa decisione? L'amicizia era davvero solo un trucco limitato che da allora ha trovato la sua strada in alcuni oscuri usi rispettabili?
Modifica per chiarimenti: sto parlando del seguente scenario, non in cui i figli di A sono esposti a B o sia a B che ai suoi figli. Posso anche immaginare di concedere facoltativamente l'accesso a sostituzioni di funzioni di amicizia, ecc.
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. */ };
Risposta accettata: come afferma Loki , l'effetto può essere simulato più o meno creando funzioni proxy protette in classi base amiche, quindi non è strettamente necessario garantire l'amicizia a una gerarchia di classe o metodo virtuale. Non mi piace la necessità di proxy boilerplate (che la base amica diventa effettivamente), ma suppongo che questo fosse ritenuto preferibile rispetto a un meccanismo linguistico che molto probabilmente sarebbe stato utilizzato in modo improprio la maggior parte del tempo. Penso che probabilmente sia giunto il momento di comprare e leggere The Design and Evolution of C ++ di Stroupstrup , che ho visto abbastanza persone qui consigliare, per ottenere una migliore comprensione di questo tipo di domande ...