2011-11-04 2 views
14

g++ mi sta negando l'accesso a un tipo, solo perché capita di essere un nonno privato. Ha senso ciò?Tipo inaccessibile a causa dell'ereditarietà privata

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(A const& a) {} 
}; 

compilando questo rendimenti:

1:10: error: ‘struct A A::A’ is inaccessible 
6:12: error: within this context 

il mio punto è: non ho mai voluto accedere A come antenato. In effetti, se A è un antenato privato di B, non dovrebbe essere completamente invisibile a chiunque tranne B (ad esempio C)?

Ovviamente, potrei usare l'ereditarietà protected ma nel mio caso non ha molto senso.

risposta

13

Ciò è dovuto al nome classe immesso da A che nasconde lo A globale all'interno di C. Sebbene sia visibile A, non è accessibile (poiché è importato come privato), quindi l'errore. Puoi accedere a A cercando nel namespace globale:

void foo(::A const& a) {} 
8

se si dichiara come segue funziona

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(::A const& a) {} 
}; 

L'errore il tuo vedere è fare per la risoluzione dei nomi non è l'accesso. The :: A dice un'occhiata al namespace globale e non ai miei tipi di classi annidate ereditate. Ricorda anche che l'ereditarietà privata sta solo dicendo che B ha un A e IMOHO è una caratteristica idiota stupida che dovrebbe essere evitata.

+1

Non è affatto una caratteristica stupida; consente di limitare l'interfaccia ereditata individuando individualmente le funzioni da mostrare con 'using'. – avakar

+2

Che cosa si potrebbe fare con le funzioni di inoltro senza la funzione e rendendo il modello di ereditarietà C++ meno ingombrante. l'ereditarietà privata non è l'ereditarietà della sua composizione e l'uso della stessa semantica per realizzare due concetti separati è solo fonte di confusione. – rerun

+2

È una differenza tra la composizione e l'ereditarietà privata, perché quest'ultima consente l'accesso ai membri protetti di tuo padre mentre il primo non lo fa. – bitmask