2010-10-20 4 views
2
class Base 
{ 
    private: 
     int var; 
}; 

class Child : protected Base 
{ 
    void someFunc() 
    { 
     var = 5; // Error: Base::var is private 
    } 
}; 

Qu'est-ce qui ne va pas?Hériter des problèmes

Répondre

4

Essayez ceci:

class Base 
{ 
    protected: 
     int var; 
}; 

Voir this reference pour la différence entre le privé, protégé et public dans C++.

+0

Oh, merci. J'ai oublié que privé/protégé sont différents dans la classe de base. – Ockonal

+0

Je suis ravi. – luke

0

Même avec l'héritage protected ou private, vous n'avez pas accès à l'utilisation des membres private dans les classes parentes.

Rendez-les protected si vous avez vraiment besoin d'y accéder directement.

Editer: dang, battu à elle.

0

Vous avez déclaré var pour avoir un accès privé dans Base. Privé signifie que seule cette classe peut voir cette variable, et non des sous-classes.

Je pense que vous voulez probablement un accès protégé dans ce cas: protected signifie que cette classe et toute sous-classe peuvent le voir.

Editer: Dang, également battu pour cela.

3

Quel est le problème est que vous essayez d'accéder à une variable privée d'une autre classe qui n'est pas un ami.

La solution la plus simple consiste à protéger var plutôt que privé, mais cela introduit des dépendances supplémentaires. Généralement, les variables doivent être privées. Stroustrup, dans son livre "Design and Evolution of C++", a regretté d'avoir introduit protected. Il considère que les données protégées sont une invitation à des problèmes et, selon son expérience, cela n'est pas nécessaire. L'ouverture de membres de données à une manipulation arbitraire par une sous-classe déclarée n'est vraiment pas beaucoup mieux que de les rendre publics. Lorsque vous êtes tenté d'utiliser des membres de données protégés, vous devriez vous demander ce que vous essayez vraiment d'accomplir. C'est évidemment un exemple construit. S'il y avait une raison pour Child pour modifier var, cette raison pourrait être exprimée dans un nom de fonction, et les fonctions protégées ne sont pas aussi mauvaises que les membres de données protégées.

+0

+1 pour avis sage. – luke

Questions connexes