class A {};
class B : private A {};
class C : private B
{
public:
class D : private A {}; // Error here
};
Ten kod daje następujący błąd (w VS 2013):Błąd zagnieżdżone klasy dziedziczenia
nested.cpp (8): error C2247: 'A' nie jest dostępna, ponieważ 'B' używa ' prywatne”odziedziczyć od«A»
robi stałe jeśli zmienić definicję D
takiego:
class D : private ::A {};
Czy to prawidłowe zachowanie, a jeśli tak, dlaczego?
Początkowo myślałem, że to dlatego, że C
dziedziczy prywatnie od B
, który ukryłby klasy bazowe. Ale jeśli wyeliminować „człowiek środka” klasy B
i po prostu korzystać z tego:
class A {};
class C : private A
{
public:
class D : private A {};
};
Błąd odchodzi.
Kompilator mówi, dlaczego. * ponieważ 'B' używa 'private' do dziedziczenia z 'A' *, nie dlatego, że C dziedziczy prywatnie z B. –
@ n.m. Cóż, to niewiele mi mówi. W końcu używam klasy z globalnej przestrzeni nazw, a nie członka czegoś. W każdym razie dostaję to teraz dzięki odpowiedziom. – user1610015
Nazwy są wyszukiwane od wewnątrz. Po znalezieniu nazwy wyszukiwanie zostaje zatrzymane. Następnie sprawdzana jest dostępność. W twoim przypadku ścieżka wyszukiwania to C> B> A. B> A jest zablokowany z powodu prywatnego dziedziczenia, A jest niedostępny. Oto, co mówi kompilator. To, że A istnieje również w zakresie globalnym i jest takie samo A, nie ma znaczenia. –