Les membres privés ne sont accessibles que dans la classe qui les définit.
Les membres protégés sont accessibles dans la classe qui les définit et dans les classes qui héritent de cette classe.
Edit: Les deux sont également accessibles par les amis de leur classe, et dans le cas des membres protégés, par les amis de leurs classes dérivées.
Edit 2: Utilisez tout ce qui a du sens dans le contexte de votre problème. Vous devez essayer de rendre les membres privés chaque fois que vous le pouvez pour réduire le couplage et protéger l'implémentation de la classe de base, mais si ce n'est pas possible, utilisez des membres protégés. Consultez la FAQ C ++ pour une meilleure compréhension du problème. Cette question sur les variables protégées pourrait également aider.
Les membres publics d'une classe A sont accessibles à tous et à tous.
Les membres protégés d'une classe A ne sont pas accessibles en dehors du code de A, mais sont accessibles à partir du code de toute classe dérivée de A.
Les membres privés d'une classe A ne sont pas accessibles en dehors du code de A ou du code d'une classe dérivée de A.
Donc, en fin de compte, choisir entre protégé ou privé répond aux questions suivantes: Quelle confiance êtes-vous prêt à accorder au programmeur de la classe dérivée?
Par défaut , supposez que la classe dérivée n'est pas fiable et rendez vos membres privés . Si vous avez une très bonne raison de donner libre accès aux internes de la classe mère à ses classes dérivées, vous pouvez les faire protéger.
la source
the protected data of the base class is part of the data of the derived class.
En effet. N'est-il pas préférable, alors, que l'écrivain de la classe dérivée déclare ces données dans sa classe, au lieu des miennes? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
Dans le modèle NVI, le but est de tout rendre privé, y compris pour limiter les dommages que le rédacteur de classe dérivé pourrait causer à la hiérarchie. Les méthodes protégées sont déjà un problème potentiel. Je ne suis pas convaincu qu'aggraver cela en utilisant l'état protégé est la bonne approche.Les membres protégés sont accessibles à partir de classes dérivées. Les particuliers ne le peuvent pas.
En termes de "meilleures pratiques", cela dépend. S'il y a même une faible possibilité que quelqu'un veuille dériver une nouvelle classe de votre classe existante et ait besoin d'accéder aux membres internes, rendez-les protégés, pas privés. S'ils sont privés, votre classe peut devenir difficile à hériter facilement.
la source
La raison pour laquelle MFC privilégie la protection est qu'il s'agit d'un cadre. Vous souhaitez probablement sous-classer les classes MFC et dans ce cas, une interface protégée est nécessaire pour accéder aux méthodes qui ne sont pas visibles pour une utilisation générale de la classe.
la source
Tout dépend de ce que vous voulez faire et de ce que vous voulez que les classes dérivées puissent voir.
la source
Les attributs et les méthodes marqués comme
protected
- contrairement aux attributs privés - sont toujours visibles dans les sous-classes.À moins que vous ne vouliez pas utiliser ou fournir la possibilité de remplacer la méthode dans les sous-classes possibles, je les ferais
private
.la source
Bien sûr, jetez un œil à la question sur les variables des membres protégés . Il est recommandé d'utiliser private par défaut (tout comme le
class
font ses C ++ ) pour réduire le couplage. Les variables membres protégées sont le plus souvent une mauvaise idée, les fonctions membres protégées peuvent être utilisées par exemple pour le modèle de méthode de modèle.la source
Les membres protégés ne sont accessibles qu'aux descendants de la classe et par code dans le même module. Les membres privés ne sont accessibles que par la classe dans laquelle ils sont déclarés et par le code dans le même module.
Bien sûr, les fonctions d'amis jettent cela par la fenêtre, mais bon.
la source
les membres privés ne sont accessibles qu'à partir de la classe, les membres protégés sont accessibles dans la classe et les classes dérivées. C'est une caractéristique de l'héritage dans les langages OO.
Vous pouvez avoir un héritage privé, protégé et public en C ++, qui déterminera à quelles classes dérivées peuvent accéder dans la hiérarchie d'héritage. C #, par exemple, n'a qu'un héritage public.
la source
privé = accessible uniquement par le vaisseau-mère (classe de base) (c'est-à-dire que seuls mes parents peuvent entrer dans la chambre de mes parents)
protégé = accessible par le vaisseau-mère (classe de base) et ses filles (c'est-à-dire que seuls mes parents peuvent aller dans la chambre de mes parents, mais ont donné à leur fils / fille la permission d'entrer dans la chambre des parents)
public = accessible par le vaisseau-mère (classe de base), la fille et tout le monde (c'est-à-dire que seuls mes parents peuvent aller dans la chambre de mes parents, mais c'est une fête à la maison - mi casa su casa)
la source
Puisqu'aucune fonction de membre public n'est nécessaire pour récupérer et mettre à jour les membres protégés dans la classe dérivée, cela augmente l'efficacité du code et réduit la quantité de code que nous devons écrire. Cependant, le programmeur de la classe dérivée est censé savoir ce qu'il fait.
la source
private
est préféré pour les données des membres. Les membres des classes C ++ sontprivate
par défaut.public
est préféré pour les fonctions de membre, bien que ce soit une question d'opinion. Certaines méthodes au moins doivent être accessibles.public
est accessible à tous. C'est l'option la plus flexible et la moins sûre. Tout le monde peut les utiliser et tout le monde peut en abuser.private
n'est pas accessible du tout. Personne ne peut les utiliser en dehors de la classe et personne ne peut en abuser. Pas même dans les classes dérivées.protected
est un compromis car il peut être utilisé dans des classes dérivées. Lorsque vous dérivez d'une classe, vous avez une bonne compréhension de la classe de base et veillez à ne pas abuser de ces membres.MFC est un wrapper C ++ pour l'API Windows, il préfère
public
etprotected
. Les classes générées par Visual Studio Assistant ont un mélange laidprotected
,public
etprivate
les membres. Mais il y a une certaine logique pour les classes MFC elles-mêmes.Les membres tels que
SetWindowText
sontpublic
parce que vous devez souvent accéder à ces membres.Des membres tels que
OnLButtonDown
, gèrent les notifications reçues par la fenêtre. Ils ne devraient pas être accessibles, donc ils le sontprotected
. Vous pouvez toujours y accéder dans la classe dérivée pour remplacer ces fonctions.Certains membres doivent faire des threads et des boucles de messages, ils ne doivent pas être accessibles ou remplacés, ils sont donc déclarés comme
private
Dans les structures C ++, les membres sont
public
par défaut. Les structures sont généralement utilisées pour les données uniquement, pas pour les méthodes, lapublic
déclaration est donc considérée comme sûre.la source
private
par défaut dans Visual Studio. C'est aussiprivate
par défaut dans gcc, ce n'est jamaispublic
par défaut. À moins que je ne me trompe à nouveau. Je ne trouve pas la norme à laquelle vous faites référence.Un membre privé n'est accessible que dans la même classe où il a déclaré où en tant que membre protégé, il est accessible dans la classe où il est déclaré avec les classes héritées par lui.
la source
Privé : il s'agit d'un spécificateur d'accès. Par défaut, les variables d'instance (membre) ou les méthodes d'une classe en c ++ / java sont privées. Pendant l'héritage, le code et les données sont toujours hérités mais ne sont pas accessibles en dehors de la classe. Nous pouvons déclarer nos données membres comme privées afin que personne ne puisse modifier directement nos variables membres et nous pouvons fournir des getters et setters publics afin de changer nos membres privés. Et ce concept est toujours appliqué dans la règle commerciale.
Protégé : c'est également un spécificateur d'accès. En C ++, les membres protégés sont accessibles dans la classe et à la classe héritée mais pas en dehors de la classe. En Java, les membres protégés sont accessibles au sein de la classe, à la classe héritée ainsi qu'à toutes les classes du même package.
la source
Un membre protégé de la classe de base non statique est accessible aux membres et amis de toutes les classes dérivées de cette classe de base en utilisant l'une des options suivantes:
la source
Privé: accessible par les fonctions des membres de la classe et la fonction ami ou la classe ami. Pour la classe C ++, il s'agit du spécificateur d'accès par défaut.
Protégé: accessible par les fonctions membres de la classe, la fonction ami ou la classe ami et les classes dérivées.
Reportez-vous à ce lien pour plus de détails.
la source
les modificateurs d'accès privés et protégés ne font qu'un et permettent d'accéder aux membres protégés de la classe de base en dehors de la portée de la classe de base dans la classe enfant (dérivée). Il en va de même pour l'héritage. Mais avec le modificateur privé, les membres de la classe de base ne sont accessibles que dans la portée ou le code de la classe de base et ses fonctions ami uniquement '' ''
la source