J'ai cherché dans SO et je n'ai pas trouvé de bonne description concernant la différence entre public
, private
et protected
L'héritage en C++. Toutes les questions supposaient un cas spécifique. Quelle est la différence ?
Réponses
Trop de publicités?L'héritage public modélise une relation IS-A. Avec
class B {};
class D : public B {};
chaque D
est un B
.
L'héritage privé modélise une relation IS-IMPLEMENTED-USING (ou quel que soit son nom). Avec
class B {};
class D : private B {};
a D
est pas a B
mais chaque D
utilise son B
dans sa mise en œuvre. L'héritage privé peut toujours être éliminé en utilisant le confinement à la place :
class B {};
class D {
private:
B b_;
};
Ce site D
peut également être mis en œuvre en utilisant B
dans ce cas, en utilisant son b_
. Le confinement est un couplage moins étroit entre les types que l'héritage, donc en général il devrait être préféré. Parfois, utiliser le confinement au lieu de l'héritage privé n'est pas aussi pratique que l'héritage privé. C'est souvent une excuse bidon pour être paresseux.
Je ne pense pas que quiconque sache ce que protected
les modèles d'héritage. En tout cas, je n'ai pas encore vu d'explication convaincante.
Si vous héritez publiquement d'une autre classe, tout le monde sait que vous héritez et vous pouvez être utilisé de manière polymorphe par n'importe qui grâce à un pointeur de classe de base.
Si vous héritez de manière protégée, seules les classes de vos enfants seront en mesure de vous utiliser de manière polymorphe.
Si vous héritez de manière privée, vous seul pourrez exécuter les méthodes de la classe mère.
Ce qui symbolise essentiellement la connaissance que les autres classes ont de ta relation avec ta classe parentale.
Les membres des données protégées sont accessibles à toutes les classes qui héritent de votre classe. Les membres privés, en revanche, ne le peuvent pas. Disons que nous avons les éléments suivants :
class MyClass {
private:
int myPrivateMember; // lol
protected:
int myProtectedMember;
};
Depuis votre extension à cette classe, en faisant référence à this.myPrivateMember
ne fonctionnera pas. Cependant, this.myProtectedMember
volonté. La valeur est toujours encapsulée, donc si nous avons une instanciation de cette classe appelée myObj
alors myObj.myProtectedMember
ne fonctionnera pas, sa fonction est donc similaire à celle d'un membre de données privé.
Résumé :
- Privé : personne ne peut le voir, sauf au sein de la classe.
- Protégé : Privé + les classes dérivées peuvent le voir
- Public : le monde entier peut le voir
Lors de l'héritage, vous pouvez (dans certaines langues) modifier le type de protection d'un élément de données dans un certain sens, par exemple de protected à public.
Private : les membres privés d'une classe de base ne sont accessibles qu'aux membres de cette classe de base.
public : les membres publics d'une classe de base sont accessibles aux membres de cette classe de base, aux membres de sa classe dérivée ainsi qu'aux membres qui sont en dehors de la classe de base et de la classe dérivée.
protected : les membres protégés d'une classe de base sont accessibles aux membres de la classe de base ainsi qu'aux membres de sa classe dérivée.
en bref :
privé : base
protégé : base + dérivé
public : base + dérivé + tout autre membre