1133 votes

Différence entre héritage privé, public et protégé

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 ?

20voto

sbi Points 100828

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.

10voto

Arkaitz Jimenez Points 10651

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.

9voto

Andrew Noyes Points 2150

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é.

7voto

Roee Adler Points 10146

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.

6voto

varun Points 11

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X