2010-01-19 5 views
10

Pourquoi l'héritage protégé et privé est-il défini et proposé? Je comprends que dans certains cas l'héritage privé pourrait être utilisé mais ce n'est pas recommandé. Que diriez-vous de l'héritage protégé?héritage protégé

Quelqu'un peut-il m'offrir une situation dans laquelle l'héritage protégé est un choix?

Je vois rarement ça.

Merci beaucoup!

Répondre

6

L'héritage privé est généralement utilisé pour les mixins --- où les gens héritent pour obtenir des fonctionnalités de la classe de base, plutôt que pour l'héritage "is-a".

L'héritage protégé peut également être utilisé pour les mixins, où la fonctionnalité mixte doit également être disponible pour les classes en aval.

+0

pouvez-vous me donner un exemple de protégé héritage, par exemple, pour l'héritage privé, voiture privée héritée du moteur est généralement utilisé. – skydoor

+1

+1. C'est je pense que la seule utilisation pour l'héritage protégé. –

+3

Voiture 'a-a' moteur. Donc idéalement 'composition' devrait être utilisé et non 'héritage'. Généralement, on devrait utiliser l'héritage quand la relation est 'is-a'. Juste mes 2 cents. – CodeRain

5

Je n'utilise généralement pas l'héritage protected. En fait, je n'utilise généralement pas l'héritage private. Si quelque chose ne satisfait pas le principe de substitution de Liskov, je ne vois aucune raison d'utiliser l'héritage de quelque sorte que ce soit; et si cela satisfait LSP alors vous utilisez l'héritage public.

Cependant, la langue fait la distinction entre private et protected uniquement du point de vue de la classe (c'est-à-dire que le code utilisant la classe ne peut pas faire la différence).

Vous devez utiliser protected héritage lorsque vous want it's semantics, et vous devez utiliser private lorsque vous ne voulez pas protected.

+1

Si quelque chose utilise l'héritage privé, alors à partir du point de vue de non-amis, il n'hérite pas de la base et ne satisfait donc certainement pas le LSP.L'héritage privé est pour lorsque l'héritage est un détail d'implémentation et non une partie de l'interface publique. Alors peut-être que cela * pourrait * satisfaire le LSP, peut-être pas, mais de toute façon vous ne le voulez pas. –

+0

Lien indique que l'accès est refusé. –

+0

Merci pour le rapport sur le lien; J'ai pointé le lien sur la super FAQ C++ semi-officielle. –

1

C'est une situation que je voudrais utiliser l'héritage protégé

Base -> Derived1 -> Derived2

  • Je ne veux pas Derived1 à substituer à la classe de base
  • Je veux utiliser la fonctionnalité dans base et également permettre le Derived2 pour l'utiliser sans exposer la fonctionnalité aux classes client
+0

Pouvez-vous donner quelques exemples? Thks – coelhudo