En faisant de l'héritage privé, vous êtes essentiellement en disant que même le fait que B hérite de A (à tous) est privé-non accessible et visible de l'extérieur.
Sans entrer dans un long-winded discussion de ce qui se passerait si elle était autorisée, le simple fait est qu'il n'est pas permis. Si vous souhaitez utiliser un pointeur à la base pour faire référence à un objet de type dérivé, alors vous êtes un peu coincé avec l'aide publique héritage.
Edit: Depuis que quelqu'un a pris la peine d'envoyer un mail pour demander plus d'informations à propos de ce qui pourrait arriver si cela était autorisé, je crois que je vais en dire un peu plus sur elle.
Le problème de base est que, privé de l'héritage est pas nécessairement l'intention de suivre le principe de substitution de Liskov. Patrimoine Public affirme qu'un objet dérivé peut être remplacé par un objet de la classe de base, et la bonne sémantique aura toujours raison. Privé de l'héritage n' a pas d'affirmer que, bien que. La description habituelle de la relation implicite privé, l'héritage est "est mis en œuvre en termes de".
Patrimoine Public désigne une classe dérivée de conserve toutes les fonctionnalités de la classe de base et potentiellement ajoute de plus en plus. Privé de l'héritage signifie souvent plus ou moins le contraire: que la classe dérivée utilise un général de la classe de base pour mettre en place quelque chose avec un nombre plus restreint de l'interface.
Juste pour exemple, supposons pour le moment que les conteneurs dans la norme C++ de la bibliothèque ont été mis en œuvre en utilisant l'héritage plutôt que de modèles. Dans le système actuel, std::deque
et std::vector
sont des conteneurs, et std::stack
est un adaptateur de conteneur qui fournit une plus restreint de l'interface. Puisqu'il est basé sur des modèles, vous pouvez utiliser std::stack
comme un adaptateur pour std::deque
ou std::vector
.
Si nous voulions essentiellement la même chose avec l'héritage, nous ne serions probablement l'utilisation privée de l'héritage, alors std::stack
serait quelque chose comme:
class stack : private vector {
// ...
};
Dans ce cas, nous avons certainement ne pas vouloir l'utilisateur d'être en mesure de manipuler nos stack
comme si c'était un vector
. Cela pourrait (et probablement) ne contreviennent pas à la hauteur des attentes d'une pile (par exemple, l'utilisateur peut insérer/supprimer des éléments dans le milieu, plutôt que purement pile-comme la mode comme prévu). Nous sommes essentiellement à l'aide d' vector
comme un moyen pratique de mettre en œuvre notre stack, mais si (par exemple), nous avons changé la mise en œuvre de stack
autonome (avec pas de dépendance sur une classe de base) ou de re-mettre en œuvre en termes de std::deque
, nous n'avons pas envie que ça affecte tout le code client, le code client, c'est censé être juste une pile, pas spécialisée variété de vecteur (ou deque).