L'héritage multiple en C ++ et le problème du diamant

Contrairement à de nombreux autres langages de programmation orientés objet, C ++ permet l'héritage multiple.

L'héritage multiple permet à une classe enfant d'hériter de plusieurs classes parentes.

Au départ, cela semble être une fonctionnalité très utile. Mais un utilisateur doit être conscient de quelques pièges lors de la mise en œuvre de cette fonctionnalité.

Dans les exemples ci-dessous, nous couvrirons quelques scénarios auxquels il faut être attentif.

Nous commencerons par un exemple simple pour expliquer ce concept en C ++.

La sortie de ce code est la suivante:

I'm breathing as a snake.I’m crawling as a snake.

Dans l'exemple ci-dessus, nous avons une classe de base nommée LivingThing . L' animalet les classes de reptiles en héritent. Seul l' animalclass remplace la méthode breathe(). La classe Snake hérite des classes Animal et Reptile . Il remplace leurs méthodes. Dans l'exemple ci-dessus, il n'y a pas de problème. Notre code fonctionne bien.

Maintenant, nous allons ajouter un peu de complexité.

Et si la classe Reptile remplace la breathe()méthode?

La classe Snake ne saurait pas quelle breathe()méthode appeler. C'est le «problème du diamant».

Problème de diamant

Regardez le code ci-dessous. C'est comme le code de l'exemple ci-dessus, sauf que nous avons remplacé la breathe()méthode dans la classe Reptile .

Si vous essayez de compiler le programme, ce ne sera pas le cas. Vous allez regarder un message d'erreur comme celui ci-dessous.

member ‘breathe’ found in multiple base classes of different types

L'erreur est due au «problème de diamant» de l'héritage multiple. La classe Snake ne sait pas quelle breathe()méthode appeler.

Dans le premier exemple, seule la classe Animal avait remplacé lebreathe()méthode. La classe Reptile ne l'avait pas fait. Par conséquent, il n'était pas très difficile pour la classe Snake de déterminer quelle breathe()méthode appeler. Et la classe Snake a fini par appeler la breathe()méthode de la classe Animal .

Dans le deuxième exemple, la classe Snake hérite de deuxbreathe() méthodes. La breathe()méthode de la classe Animal and Reptile . Puisque nous n'avons pas remplacé la breathe()méthode dans la classe Snake , il y a ambiguïté.

C ++ possède de nombreuses fonctionnalités puissantes telles que l'héritage multiple. Mais il n'est pas nécessaire que nous utilisions toutes les fonctionnalités qu'il offre.

Je ne préfère pas utiliser l'héritage multiple et utiliser l' héritage virtuel à la place.

L'héritage virtuel résout le «problème de diamant» classique. Cela garantit que la classe enfant n'obtient qu'une seule instance de la classe de base commune.

En d'autres termes, la classe Snake n'aura qu'une seule instance de la classe LivingThing . Les classes Animal et Reptile partagent cette instance.

Cela résout l'erreur de compilation que nous recevons plus tôt. Les classes dérivées de classes abstraites doivent remplacer les fonctions virtuelles pures définies dans la classe de base.

J'espère que vous avez apprécié cet aperçu de l'héritage multiple et du «problème du diamant».