133 votes

Quand dois-je utiliser l'héritage privé C++ ?

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 ?

7voto

Tim Points 13334

Je ne l'utilise jamais.

4voto

bias Points 869

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).

0 votes

Cela n'a pas l'air très utile... pouvez-vous donner un exemple ?

0 votes

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 ?

0 votes

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.

2voto

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.

0 votes

Il n'y a pas besoin de la déclaration préalable de BigClass existe-t-il dans cet exemple ? Je trouve ça intéressant, mais ça me fait penser à du piratage.

1voto

bayda Points 7454

Parfois, il peut s'agir d'une alternative à l'agrégation, par exemple si vous souhaitez une agrégation mais avec un comportement modifié de l'entité agrégable (avec une fonction virtuelle prioritaire).

Mais vous avez raison, il n'y a pas beaucoup d'exemples du monde réel.

1voto

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.com

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.

Powered by:

X