Contrairement à l'héritage protégé, l'héritage privé C++ a trouvé sa place dans le courant dominant du développement C++. Cependant, je n'ai toujours pas trouvé une bonne utilisation pour lui.
Quand l'utilisez-vous ?
Contrairement à l'héritage protégé, l'héritage privé C++ a trouvé sa place dans le courant dominant du développement C++. Cependant, je n'ai toujours pas trouvé une bonne utilisation pour lui.
Quand l'utilisez-vous ?
Je la trouve utile pour les interfaces (c'est-à-dire les classes abstraites) dont j'hérite et pour lesquelles je ne veux pas que d'autres codes touchent l'interface (seulement la classe qui en hérite).
[ajout d'un exemple]
Prenez le ejemplo dont le lien figure ci-dessus. Disant que
[...] La classe Wilma doit invoquer les fonctions membres de votre nouvelle classe, Fred.
c'est dire que Wilma exige que Fred soit capable d'invoquer certaines fonctions membres, ou plutôt, c'est dire que Wilma est une interface . Ainsi, comme mentionné dans l'exemple
L'héritage privé n'est pas mauvais ; il est simplement plus coûteux à maintenir, car il augmente la probabilité que quelqu'un modifie quelque chose qui cassera votre code.
commente l'effet souhaité sur les programmeurs qui doivent répondre à nos exigences en matière d'interface, ou casser le code. Et, puisque fredCallsWilma() est protégé, seuls les amis et les classes dérivées peuvent y toucher, c'est-à-dire une interface héritée (classe abstraite) que seule la classe héritante peut toucher (et les amis).
[modifié dans un autre exemple]
Cette page aborde brièvement les interfaces privées (sous un autre angle).
Je crois que je vois où vous voulez en venir... Un cas d'utilisation typique pourrait être que Wilma est un type de classe utilitaire qui a besoin d'appeler des fonctions virtuelles dans Fred, mais les autres classes n'ont pas besoin de savoir que Fred est implémentée en termes de Wilma. N'est-ce pas ?
Oui. Je dois préciser que, à ma connaissance, le terme "interface" est plus couramment utilisé en Java. La première fois que j'en ai entendu parler, j'ai pensé qu'on aurait pu lui donner un meilleur nom. En effet, dans cet exemple, nous avons une interface avec laquelle personne ne s'interface dans le sens où nous l'entendons habituellement.
Je trouve parfois utile d'utiliser l'héritage privé lorsque je veux exposer une petite interface (par exemple une collection) dans l'interface d'une autre, où l'implémentation de la collection nécessite l'accès à l'état de la classe exposante, d'une manière similaire aux classes internes en Java.
class BigClass;
struct SomeCollection
{
iterator begin();
iterator end();
};
class BigClass : private SomeCollection
{
friend struct SomeCollection;
SomeCollection &GetThings() { return *this; }
};
Ainsi, si SomeCollection a besoin d'accéder à BigClass, elle peut static_cast<BigClass *>(this)
. Il n'est pas nécessaire d'avoir un membre de données supplémentaire qui prend de l'espace.
Si la classe dérivée - doit réutiliser du code et - on ne peut pas modifier la classe de base et - protège ses méthodes en utilisant les membres de la base sous un verrou.
alors vous devez utiliser l'héritage privé, sinon vous risquez d'avoir des méthodes de base non verrouillées exportées par cette classe dérivée.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.