2011-11-04 11 views
14

g++ odmawia mi dostępu do typu, tylko dlatego, że jest to prywatny dziadek. Czy to ma sens?Niedostępny typ z powodu prywatnego dziedziczenia

struct A {}; 

struct B : private A {}; 

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

sporządzenia niniejszego plony:

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

Mój punkt brzmi: nigdy nie chciałem, aby uzyskać dostęp A jako przodka. W rzeczywistości, jeśli A jest prywatnym przodkiem B, czy nie powinno to być całkowicie niewidoczne dla nikogo oprócz B (tj.)?

Oczywiście mógłbym używać dziedziczenia protected, ale w moim przypadku nie ma to większego sensu.

Odpowiedz

13

Jest to spowodowane wtryskiwaną nazwą klasy z A ukrywanie globalnej A wewnątrz C. Chociaż jest widoczny A, nie jest dostępny (ponieważ jest importowany jako prywatny), stąd błąd. Można uzyskać dostęp A szukając go w globalnej przestrzeni nazw:

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

jeśli zadeklarować ją w następujący sposób działa

struct A {}; 

struct B : private A {}; 

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

Błąd Twój zobaczyć to zrobić do rozpoznawania nazw nie ma dostępu. The :: A mówi, że patrzymy na globalną przestrzeń nazw, a nie na moje odziedziczone typy klas zagnieżdżonych. Pamiętaj też, że prywatne dziedzictwo mówi po prostu, że B ma A, a IMOHO jest głupią cechą językową, której należy unikać.

+1

to nie jest głupi funkcja w ogóle; pozwala ograniczyć dziedziczony interfejs poprzez indywidualne wybieranie funkcji do wyświetlania przy użyciu 'use'. – avakar

+2

Co można zrobić z funkcjami forwardera bez funkcji i dzięki czemu model dziedziczenia C++ jest mniej zagracony. dziedziczenie prywatne nie jest dziedziczeniem, a jego skład i używanie tej samej semantyki do realizacji dwóch oddzielnych koncepcji jest tylko mylące. – rerun

+2

Jest to różnica między składem a dziedziczeniem prywatnym, ponieważ ta ostatnia pozwala na dostęp do chronionych członków twojego ojca, podczas gdy ten pierwszy nie. – bitmask

Powiązane problemy