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

Quelle est la différence entre les héritages "public", "privé" et "protégé" en C++ ? Toutes les questions que j'ai trouvées sur SO traitent de cas spécifiques.

Solution

Pour répondre à cette question, j'aimerais d'abord décrire les accesseurs de Member avec mes propres mots. Si vous le savez déjà, passez directement à la rubrique "suivant :".

Il y a trois accesseurs que je connais : public, protégé et privé.

Laissez :

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • Tout ce qui est conscient de Base est aussi conscient que Base contient publicMember.
  • Seuls les enfants (et leurs enfants) savent que Base contient protectedMember.
  • Personne d'autre que Base n'est au courant de privateMember.

Par "est conscient de", j'entends "reconnaît l'existence de, et donc peut accéder à".

suivant :

Il en va de même pour l'héritage public, privé et protégé. Considérons une classe Base et une classe Child qui hérite de Base.

  • Si l'héritage est "public", tout ce qui est conscient de "Base" et "Enfant" est également conscient que "Enfant" hérite de "Base".
  • Si l'héritage est "protégé", seuls "Enfant" et ses enfants savent qu'ils héritent de "Base".
  • Si l'héritage est "privé", personne d'autre que "Child" n'est au courant de l'héritage.
Commentaires (12)

Il s'agit de la façon dont les membres publics de la classe de base sont exposés dans la classe dérivée.

  • public -> les membres publics de la classe de base seront publics (généralement la valeur par défaut).
  • protégé -> les membres publics de la classe de base seront protégés.
  • private -> les membres publics de la classe de base seront privés.

Comme le souligne litb, l'héritage public est l'héritage traditionnel que vous verrez dans la plupart des langages de programmation. C'est-à-dire qu'il modélise une relation "IS-A". L'héritage privé, quelque chose d'AFAIK propre au C++, est une relation "MISE EN ŒUVRE EN TERMES DE". C'est-à-dire que vous voulez utiliser l'interface publique dans la classe dérivée, mais vous ne voulez pas que l'utilisateur de la classe dérivée ait accès à cette interface. Beaucoup soutiennent que dans ce cas, vous devriez agréger la classe de base, c'est-à-dire qu'au lieu d'avoir la classe de base comme une base privée, faites-en un membre de la classe dérivée afin de réutiliser la fonctionnalité de la classe de base.

Commentaires (2)

Il s'agit essentiellement de la protection de l'accès des membres publics et protégés de la classe de base dans la classe dérivée. Avec l'héritage public, la classe dérivée peut voir les membres publics et protégés de la classe de base. Avec l'héritage privé, elle ne le peut pas. Avec l'héritage protected, la classe dérivée et toutes les classes dérivées de celle-ci peuvent les voir.

Commentaires (0)