Bien que j'ai vu des cas rares où privé héritage était nécessaire, je n'ai jamais rencontré un cas où protégé héritage est nécessaire. Est-ce que quelqu'un a un exemple?Existe-t-il des exemples où nous avons besoin de l'héritage protégé en C++?
Répondre
Les personnes ici semblent confondre l'héritage protégé et les méthodes protégées. FWIW, je n'ai jamais vu quelqu'un utiliser l'héritage de classe protégée, et si je me souviens bien, je pense que Stroustrup a même considéré le niveau "protégé" comme une erreur en C++. Il y a peu de choses que vous ne pouvez pas faire si vous supprimez ce niveau de protection et ne comptez que sur le public et le privé.
C++ FAQ Lite mentionne un cas où l'utilisation de l'héritage privé est une solution légitime (Voir [24.3.] Which should I prefer: composition or private inheritance?). Il est quand vous voulez appeler la classe dérivée à partir d'une classe de base privée par le biais d'une fonction virtuelle (dans ce cas derivedFunction()
):
class SomeImplementationClass
{
protected:
void service() {
derivedFunction();
}
virtual void derivedFunction() = 0;
// virtual destructor etc
};
class Derived : private SomeImplementationClass
{
void someFunction() {
service();
}
virtual void derivedFunction() {
// ...
}
// ...
};
Maintenant, si vous voulez tirer de la classe dérivée, et que vous souhaitez utiliser Base::service()
depuis la classe dérivée (disons que vous voulez déplacer Derived::someFunction()
vers la classe dérivée), la manière la plus simple d'y parvenir est de changer l'héritage privé de Base
en héritage protégé.
Désolé, je ne peux pas penser à un exemple plus concret. Personnellement, j'aime rendre public tout l'héritage afin d'éviter de perdre du temps avec les discussions «Devrais-je faire en sorte que les relations d'héritage soient protégées ou privées?
mais ce n'est pas ce que l'affiche a demandé, à propos de l'héritage protégé. Il y a certainement des cas où vous voudriez l'héritage privé, mais pas trop. –
Il existe un cas d'utilisation très rare de l'héritage protégé. Il est là que vous voulez utiliser covariance:
struct base {
virtual ~base() {}
virtual base & getBase() = 0;
};
struct d1 : private /* protected */ base {
virtual base & getBase() {
return this;
}
};
struct d2 : private /* protected */ d1 {
virtual d1 & getBase() {
return this;
}
};
L'extrait précédent a essayé de cacher sa classe de base, et de fournir une visibilité contrôlée des bases et de leurs fonctions, pour une raison quelconque, en fournissant une fonction « getBase ».
Cependant, il échouera dans la structure d2
, car d2
ne sait pas que d1
est dérivé de base
. Ainsi, covariance
ne fonctionnera pas. Un moyen de s'en sortir est de les protéger, de sorte que l'héritage soit visible dans d2.
Un exemple similaire de l'utilisation de cette option est lorsque vous dérivez de std::ostream
, mais que vous ne voulez pas que des personnes aléatoires écrivent dans votre flux. Vous pouvez fournir une fonction getStream
virtuelle qui renvoie std::ostream&
. Cette fonction pourrait faire un peu de préparation du flux pour la prochaine opération. Par exemple mettre certains manipulateurs dans
std::ostream& d2::getStream() {
this->width(10);
return *this;
}
logger.getStream() << "we are padded";
- 1. Avons-nous vraiment besoin de NULL?
- 2. Pourquoi avons-nous besoin de JavaFX alors que nous avons Swing?
- 3. Pourquoi avons-nous encore besoin d'un fichier stub .lib quand nous avons l'implémentation réelle .dll?
- 4. Pourquoi avons-nous besoin du fichier pfx (échange de clés)?
- 5. Pourquoi avons-nous besoin de flux Reader/Writer lors de l'utilisation de TCPListner en réseau C#?
- 6. Pourquoi avons-nous besoin de l'interrogation Comet ou HTTP lorsque nous n'utilisons pas de navigateur?
- 7. En quoi un panneau WPF Wrap est plus lent que nous avons besoin d'un panneau virtuel
- 8. Accessibilité (WCAG 2.0) avons-nous besoin d'étiquettes dans les cellules de table
- 9. Pourquoi avons-nous besoin de constructeurs et de membres privés dans la classe abstraite?
- 10. pourquoi avons-nous besoin à la fois const et getters non-const dans cet exemple
- 11. Socket Programmimg en C, ont besoin des exemples de code et des tutoriels
- 12. Avons-nous besoin d'installer le certificat de signature de code intermédiaire pour une application XBAP/ClickOnce de confiance totale?
- 13. Avons-nous l'akismet api à utiliser sur les pages html?
- 14. Où puis-je trouver des exemples de "Soupe de rêve"?
- 15. PDF protégé par mot de passe en utilisant C#
- 16. Redondance, fiabilité et tolérance aux pannes en C# - où chercher des exemples?
- 17. Donner des animations lorsque nous avons créé la visibilité d'un UIDatePicker
- 18. Comment pouvons-nous effectuer une application multi-threading en C#?
- 19. Corruption de données dans l'accès protégé en C++
- 20. Où trouver des exemples de codage Flash/Flex, un exemple de chronologie en particulier?
- 21. Si vous n'utilisez pas exec ("ls -l") en PHP, avons-nous besoin d'appeler stat() pour obtenir les tailles de fichier 1000 fois s'il y a 1000 fichiers?
- 22. Ces exemples sont-ils des fermetures C#?
- 23. Exemples d'échantillons génériques C#
- 24. Est-il possible d'authentifier en utilisant OAuth sans demander à l'utilisateur quand nous avons les informations d'identification de l'utilisateur?
- 25. Où puis-je trouver des exemples de bsddb en cours d'utilisation?
- 26. Exemples de conception de serveurs réseau efficaces, écrits en C
- 27. L'accessibilité peut parfois échouer, même lorsque nous avons une connexion Internet
- 28. Où puis-je trouver des exemples pour la génération de clé de licence dans une application Windows C# .NET?
- 29. Qu'est-ce que le Mutex et le sémaphore In C#? où nous devons mettre en œuvre?
- 30. protégé/privé - pourquoi s'embêter?
Juste un commentaire rapide: Monsieur C le nom de ++ est Stroustrup;) –
Bon Dieu, je vais le corriger immédiatement.! :) –