Pourquoi avons-nous réellement besoin Privés ou Protégés de l'héritage en C++?
En C++, je ne peux pas penser à un cas dans lequel je voudrais hériter privé/abri d'un
classe de base:
class Base;
class Derived1 : private Base;
class Derived2 : protected Base;
Est-il vraiment utile?
- Considérez ceci: un cercle est une ellipse, mais le Cercle n'est pas substituables pour Ellipse, patrimoine public est pas une relation " est-un, même si nous avons souvent l'appelle ainsi.
- Le cercle est en effet une ellipse. Pas sûr de ce que tu veux dire?
Vous devez vous connecter pour publier un commentaire.
Il est utile lorsque vous souhaitez avoir accès à certains membres de la classe de base, mais sans les exposer dans votre interface de classe. Privé de l'héritage peut être vu aussi comme une sorte de composition: le C++ faq lite donne l'exemple suivant pour illustrer cette affirmation
Pour obtenir la même sémantique, vous pouvez également écrire la Classe de voiture comme suit:
Cependant, cette façon de faire présente plusieurs inconvénients:
Privé peut être utile dans pas mal de circonstances. L'un d'entre eux, ce sont des politiques:
Est partielle de la classe template de la spécialisation de la réponse à ce problème de conception?.
Une autre occasion où il est utile, c'est d'interdire la copie et de l'affectation:
Parce que nous ne voulons pas que l'utilisateur dispose d'un pointeur de type
noncopyable*
à notre objet, nous tirons privé. Ce qui compte, non seulement pour noncopyable, mais beaucoup d'autres classes de trop (politiques étant le plus commun).Public de l'héritage de modèles, c'EST-A.
Non-public de l'héritage des modèles EST mis en œuvre EN TERMES DE.
Le confinement des modèles A-A, ce qui est équivalent à appliquer-EN-TERMES-DE.
Sutter sur le sujet. Il explique que lorsque vous choisissez non-public de l'héritage de plus de confinement pour les détails de mise en œuvre.
Par exemple, si vous souhaitez réutiliser la mise en œuvre, mais pas l'interface d'une classe ET d'outrepasser ses fonctions virtuelles.
Privé de l'héritage est principalement utilisé pour de mauvaises raisons. Les gens l'utilisent pour appliquer-EN-TERMES-DE, comme indiqué dans une précédente réponse, mais dans mon expérience, c'est toujours plus propre à conserver une copie plutôt que d'en hériter de la classe. Une précédente réponse, l'un sur les CBigArray, offre un parfait exemple de cet anti-modèle.
Je me rends compte qu'il peut y avoir des cas où a-a ne fonctionne pas en raison d'une trop zélé utilisation de "protégés", mais il est préférable de fixer le cassé de la classe que de casser une nouvelle classe.
J'ai utilisé à la fois protégées et à l'héritage, à un moment ou un autre.
Privé de l'héritage est utile lorsque vous voulez quelque chose pour avoir le comportement de la classe de base, et ensuite être capable de passer outre à cette fonctionnalité, mais vous ne voulez pas tout le monde d'être conscient et de l'utiliser. Vous pouvez toujours utiliser l'interface d'une société privée de la classe dérivée par avoir un retour de fonction de l'interface. Il est également utile si vous pouvez avoir des choses s'inscrire eux-mêmes à écouter pour les rappels, car ils peuvent s'inscrire eux-mêmes à l'aide de l'interface privée.
Protégé héritage est particulièrement utile lorsque vous avez une base de classe qui dérive de fonctionnalité utile d'une autre classe, mais vous ne voulez ses classes dérivées pour être en mesure de l'utiliser.
Une fois, j'ai mis en place ces structures de données comme les classes:
Le grand tableau de l'interface serait de la faire ressembler à un tableau, cependant, c'était en fait une liste liée de taille fixe de simples tableaux. J'ai donc déclaré comme ceci: