Qu’est-ce que le problème du diamant en C++ ? Comment le repérer et comment le réparer

L’héritage multiple en C++ est efficace, mais c’est un outil difficile, qui conduit souvent à des problèmes autrement utilisés avec beaucoup de précautions – des problèmes comme le problème du diamant.

Dans cet article, nous discuterons certainement du problème du diamant, de la manière dont il se produit à partir de nombreux héritages et de ce que vous pouvez faire pour résoudre le problème.

Héritage multiple en C++

L’héritage multiple est un attribut de la programmation orientée objet (POO) dans lequel une sous-classe peut hériter de plusieurs superclasses. En termes simples, un cours enfant peut avoir plus d’un parent.

Le numéro ci-dessous programme une représentation photographique de nombreux héritages.

Dans la disposition ci-dessus, classe C a Classe A et classe B comme ses parents.

Si l’on considère une situation réelle, un enfant hérite de son père et aussi de sa mère. Ainsi, un enfant peut être considéré comme un cours obtenu avec « Père » et « Mère » comme parents. De la même manière, nous pouvons avoir de nombreuses instances réelles d’héritage multiple.

En succession multiple, les fabricants d’une classe acquise sont exécutés dans l’ordre où ils sont acquis. D’autre part, les destructeurs sont implémentés dans l’ordre inverse de leur héritage.

Illustrons maintenant les nombreux héritages et confirmons l’ordre de construction ainsi que les dégâts des objets.

Code Illustration de l’héritage multiple

Pour l’image d’héritage multiple, nous avons en fait précisément défini la représentation ci-dessus en C++. Le code du programme est proposé ci-dessous.

La sortie que nous obtenons du programme ci-dessus est conforme à :

Maintenant, si nous vérifions le résultat, nous voyons que les érecteurs sont appelés ordre B, A, ainsi que C tandis que les destructeurs restent dans l’ordre inverse. Maintenant que nous connaissons l’essentiel de plusieurs héritages, nous passons à parler du problème du diamant.

Voir aussi :  Comment ajouter des objets mobiles aléatoires dans Godot

Le problème du diamant, expliqué

Le problème du diamant se produit lorsqu’une classe enfant acquiert à partir de 2 cours parents qui partagent tous deux un cours grand-parent habituel. Ceci est illustré dans la disposition ci-dessous :

DiamantHéritage

Ici, nous avons un cours Enfant hériter des cours Père et Mère . Ces deux cours acquièrent, par conséquent, le cours Personne en raison du fait que le Père ainsi que la Mère sont une Personne.

Comme indiqué dans le nombre, bien sûr Enfant acquiert les attributs de la classe Personne deux fois – une fois de Père et aussi de nouveau de Mère. Cela déclenche une ambiguïté car le compilateur ne parvient pas à comprendre quelle méthode utiliser.

Ce scénario déclenche un graphique d’héritage en forme de losange et est également notoirement appelé « Le problème du diamant ».

Illustration de code du problème du diamant

Ci-dessous, nous avons en fait représenté l’exemple ci-dessus d’héritage en forme de losange par programmation. Le code est proposé ci-dessous :

Voici le résultat de ce programme :

Maintenant, vous pouvez voir l’ambiguïté ici. Le module de cours Personne est appelé deux fois : dès que l’objet de la classe Père est produit et ensuite lorsque l’élément de la classe Mère est créé. Les maisons de la classe Person sont héritées deux fois, déclenchant une ambiguïté.

Étant donné que le fabricant de la classe Person est appelé deux fois, le destructeur sera certainement appelé deux fois en plus lorsque l’élément de la classe Child est détruit.

Voir aussi :  Comment cloner un référentiel GitHub avec Git Bash

Maintenant, si vous avez correctement identifié le problème, parlons du service au problème du diamant.

Comment résoudre le problème du diamant en C++

Le remède au problème du rubis est d’utiliser le virtuel phrase clé. Nous transformons les deux cours maman et papa (qui héritent du même cours grand-parent) en cours numériques pour éviter 2 doublons du cours grand-parent dans le cours enfant.

Changeons l’image ci-dessus et inspectons le résultat :

Illustration de code pour résoudre le problème du diamant

Ici, nous avons utilisé le virtuel mot-clé lorsque les cours Père et Mère acquièrent le cours Personne. C’est ce qu’on appelle normalement « l’héritage en ligne », qui garantit qu’une seule instance de la classe héritée (dans ce cas, le cours Person) est transmise.

En d’autres termes, le cours Enfant aura une situation unique de la classe Personne, partagée par les cours Père et Mère. En ayant une seule instance de la classe Person, l’obscurité est résolue.

Le résultat du code ci-dessus est proposé ci-dessous :

Ici, vous pouvez voir que la classe Personne monteur n’est appelée qu’une fois.

Une chose à noter à propos de l’héritage en ligne est que même si le fitter paramétré de la classe Person est clairement appelé par les producteurs de cours Father et Mother via des listes d’initialisation, seul le producteur de base de la classe Person sera appelé .

C’est parce qu’il n’y a qu’un seul cas d’une classe de base virtuelle qui est partagée par plusieurs classes qui en acquièrent.

Voir aussi :  Comment remplacer les modèles par défaut dans django-allauth

Pour éviter que le constructeur de base ne s’exécute plusieurs fois, le fabricant d’une classe de base numérique n’est pas appelé par la classe qui l’acquiert. Au lieu de cela, le fabricant est appelé par le monteur du cours de béton.

Dans l’instance terminée, le cours Enfant appelle directement l’entrepreneur de base pour la classe Personne.

Que se passe-t-il si vous avez besoin d’implémenter l’ajusteur paramétré de la classe de base ? Vous pouvez le faire en l’appelant explicitement dans le cours Enfant par opposition aux cours Père ou Mère.

Le problème du diamant en C++, résolu

Le problème du diamant est une ambiguïté qui survient dans l’héritage multiple lorsque 2 classes parentes acquièrent du même cours grand-parent, et que les deux cours parents sont hérités par une seule classe enfant. Sans faire usage de l’héritage virtuel, le cours pour enfants acquerrait certainement deux fois les propriétés résidentielles du cours pour grands-parents, ce qui créerait une ambiguïté.

Cela peut souvent apparaître dans le code du monde réel, il est donc important d’aborder cette obscurité chaque fois qu’elle est vue.

Le problème du diamant est pris en charge en utilisant l’héritage en ligne, dans lequel le virtuel La phrase de recherche est utilisée lorsque les classes de mamans et de papas acquièrent d’un cours de grands-parents partagé. Ce faisant, un seul duplicata du cours grand-parent est créé, et la construction du cours grand-parent est également effectuée par le cours enfant.

Cliquez pour évaluer cet article !
[Total: Moyenne : ]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *