L'héritage public et privé en C ++
Comme nous le savons de la littérature pour le public de l'héritage de l'objet de l'enfant de la classe (sous-classe) peut aussi être considéré comme un objet de la classe de base (super-classe). Pourquoi l'objet de la sous-classe ne peut pas être considéré comme un objet de la super-classe, lorsque l'héritage est protégé ou privé?
source d'informationauteur Narek
Vous devez vous connecter pour publier un commentaire.
Parce que vous ne pouvez pas le voir:
De sorte que vous ne pouvez pas utiliser un PrivateDerived objet où un objet de Base pourrait être utilisé.
Donc, il ne sera jamais agir comme un objet de classe de Base.
En général, vous trouverez dans la littérature (et dans d'autres réponses ici) que
protected
/private
héritage implique que la classe ne peut pas être utilisé comme unbase
. Le fait (une autre réponse conseils dans ce sujet), c'est que seule la visibilité de l'héritage est affectée par l'opération. Lederived
classe est unbase
classe, même si le code externe ne peut pas voir.Tout
friend
ou la classe sera en mesure de faire usage de cette relation:Maintenant, alors que techniquement, c'est le cas, sémantiquement lorsque vous utilisez
private
l'héritage que vous essayez d'modèle pas unis-a
mais plutôt unimplemented-in-terms-of
relation. C'est la partie importante: lors de la lecture de code, si vous voyezprivate
héritage que vous ne devriez pas penser sur est- mais mis en œuvre en termes de.Le "pourquoi" est simple lorsque l'on considère la façon dont le mécanisme fonctionne: car protégé et privé de l'héritage sont destinés à travailler de cette façon.
Ce n'est probablement pas suffisant pour répondre à la question de l'intention. Vous pourriez vous demander "et pourquoi ont privés et protégés de succession si vous ne pouvez pas utiliser les objets comme des instances de la classe de base?"
Même, les non-publics de l'héritage est destinée à faciliter l' "est mis en œuvre en termes de" relation entre deux classes (alors que le public l'héritage facilite le "est-un" de la relation). En d'autres termes, vous avez l'intention de réutiliser tout ou une partie de la classe de base des fonctionnalités à fournir des services à vos propres consommateurs.
Ce scénario est presque toujours mieux mis en œuvre par l'agrégation, au lieu de la succession (c'est à dire, avoir un objet membre de la "base" de la classe), et j'irais même jusqu'à dire que le non-public de l'héritage est quelque chose de mieux laissés seuls.
Prendre un coup d'oeil à cette pour une plus longue écriture-up qui se développe sur la ci-dessus.
Mise à jour: que les commentateurs ci-dessous l'état, il y a quelques (certes rares) cas où la non-patrimoine public fournit le mécanisme d'architecture pour des fonctionnalités qui ne serait pas possible autrement. Faire lire, explorer les bords d'une langue peut être très éclairant. Mais essayer de le faire aussi peu que vous le pouvez, de toute façon.
En bref, parce que l'héritage est l'héritage de mise en œuvrepas que de interface. Privé sous-classe
Derived
objet n'est pas unBase
mais est mis en œuvre en termes deBase
. Le public et les membres protégés deBase
sont visibles pourDerived
mais ils deviennent privédonc inaccessible pour le monde extérieur. Ainsi privé de l'héritage peut être considéré comme une forme particulière de compositionqui est en fait rarement nécessaire dans la pratique. (Et protégé de l'héritage est pratiquement jamais en fait probablement la même Bjarne Stroustrup ne sais pas ce protégé d'hérédité.)public
héritage sert à la relation " est-un. Qui est:private
héritage sert le but de l'a-une relation. Vous pouvez écrire presque toute la classe à l'aide de privé de l'héritage à l'aide d'un modèle d'emballage:peut être réécrite (et le plus souvent, doit être réécrit pour plus de clarté):
protected
l'héritage est similaire àprivate
mais, en réalité, ne devrait jamais être utilisée (Scott Meyers et Herb Sutter la fois de donner les raisons de cela dans leurs livres respectifs).Vous pouvez penser public /protected /private héritage comme l'accessibilité pour n'importe quel membre de la classe : c'est une question de "combien voulez-vous de montrer".
Privé (ou protégé, de manière un peu différente) l'héritage est une relation qui n'est pas montré au monde extérieur. En tant que tel, vous ne pouvez pas traiter un objet d'un type dérivé comme privé de base, parce que vous n'obtenez pas de "voir" que cette relation existe.
Il peut certainement être considéré comme un objet de la super-classe. Cependant, une telle contrepartie est limité (par le public/protected/private inhertiance modificateur), mais seulement par lui-même (privé de l'héritage), ou c'est sous-classes (protégé de l'héritage).
Tous les objets externes ne sont pas autorisés à prendre en compte la classe en tant que telle, similaire à la façon dont-ils pas autorisés à accès protégé ou privé, les méthodes ou les variables. L'analogie est plutôt approprié, si elle est exprimée correctement.
Donc, la classe elle-même, ses sous-classes (et des amis) peuvent voir cela comme une relation " est-un, mais le monde extérieur n'est pas autorisée à le faire.
Le code suivant illustre cela en action:
Noter qu'il n'a pas d'importance comment les xxxSubClass-classes dérivent de leurs super-classes. Il est tout au sujet de la façon dont les super-classes dérivent de Basequi est comme il se doit.
Le compilateur se plaint de façon appropriée: