2011-11-04 1 views
14

g++ Me refuse l'accès à un type, juste parce qu'il se trouve être un grand-père privé. Est-ce que ça a du sens?Type inaccessible en raison de l'héritage privé

struct A {}; 

struct B : private A {}; 

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

replissant ce rendement:

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

Mon point est: je ne voulais accéder A comme un ancêtre. En fait, si A est un ancêtre privé de B, cela ne devrait-il pas être complètement invisible pour tout le monde mais B (c'est-à-dire C)?

Bien sûr, je pourrais utiliser l'héritage protected mais dans mon cas cela n'a pas vraiment de sens.

Répondre

13

Ceci est dû au nom de classe injecté de A masquant le A global à C. Bien que A soit visible, il n'est pas accessible (puisqu'il est importé en privé), d'où l'erreur. Vous pouvez accéder à A en le recherchant dans l'espace de noms global:

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

si vous déclarez comme suit fonctionne

struct A {}; 

struct B : private A {}; 

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

L'erreur est votre vision à faire la résolution de noms d'accès non. Le :: A dit regarder l'espace de noms global pas mes types de classe imbriqués hérités. Souvenez-vous aussi que l'héritage privé dit simplement que B a un A et que IMOHO est un langage idiot qui devrait être évité.

+1

Ce n'est pas une fonctionnalité stupide du tout; il permet de restreindre l'interface héritée en sélectionnant individuellement les fonctions à exposer avec 'using'. – avakar

+2

Ce que vous pouvez faire avec les fonctions de redirecteur sans la fonctionnalité et rendre le modèle d'héritage C++ moins encombré. l'héritage privé n'est pas l'héritage de sa composition et l'utilisation de la même sémantique pour accomplir deux concepts distincts n'est que source de confusion. – rerun

+2

C'est une différence entre la composition et l'héritage privé, car ce dernier vous permet d'accéder à des membres protégés de votre père alors que le premier ne le fait pas. – bitmask

Questions connexes