classe de base virtuelle
Dans le processus d'héritage que j'ai appris auparavant, je me demande si vous avez pensé à cette situation : dans une relation d'héritage multiple, si une classe dérivée hérite de deux classes parentes, et que ces deux classes parentes héritent d'une classe héritée de la base classe. Ce serait gênant, car vous pourriez hériter de deux copies du même membre !
Cela conduit au soi-disant problème d’ambiguïté . Commençons à étudier !
Laissez-moi d’abord vous donner un exemple qui illustre ce genre d’héritage multiple ! J'y ai réfléchi et j'ai trouvé cet exemple : Il y avait une famille riche. Au début, il y avait deux fils. Le maître était en charge et gardait la clé de la porte. Quelques années, ils ont grandi et le maître était vieux, alors il a associé deux autres clés et les a données respectivement à ses deux fils, et les a laissés prendre en charge l'entreprise familiale. Après de nombreuses années, les deux fils se sont également mariés. et il y avait respectivement un garçon et une fille, petits-enfants, perpétuant la lignée familiale. Les soi-disant gens sont prospères, et plus tard ils ont grandi, et il est temps de remettre la clé. Dans les temps anciens, la clé était bien sûr transmise au garçon, donc bien sûr la clé était donnée au petit-fils. cette fois-ci, le père du petit-fils et son oncle (c'est-à-dire les deux fils du propriétaire original) devaient tous donner une clé au petit-fils, il avait donc deux clés. Le petit-fils regarda les deux clés dans sa main et dit : « Une suffit ! Deux... n'est-ce pas du gaspillage ?
Après avoir lu cette histoire, il sera plus facile pour tout le monde de comprendre l'héritage. Le protagoniste masculin original de l'histoire, grand-père, est la classe de base. Ses deux enfants sont deux classes dérivées, et l'enfant de l'un d'eux est le petit. Sun Tzu est la dernière classe dérivée car il hérite de deux classes dérivées. Et ces deux classes dérivées ont un membre commun (clé, car elles héritent toutes deux de la même classe de base – grand-père). La dernière classe dérivée de Sun Tzu possède deux membres en double (clés), ce qui est source d'ambiguïté !
Ci-dessous, nous suivons cet exemple et écrivons le code spécifiquement, vous pouvez vous y référer :
/************************************//Des : Démo du tutoriel C++//Auteur : Huang/ /Droit d'auteur : www.dotcpp.com//Date : 2017/12/18********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ Petit-filsA ;//A.key=9;return0;}
Le code est une manifestation de l'histoire du moment. Pour faciliter la description, les quatre classes définies sont vides. Concentrez-vous simplement sur la relation d'héritage. Autrement dit, la classe Grandson hérite de deux classes père et aura deux membres clés. Si vous essayez d'utiliser cette clé à ce moment-là, veuillez noter qu'elle a été déclarée comme type public lorsque vous essayez d'attribuer une valeur dans la fonction principale. , il y aura un message d'erreur "non unique, ambigu" , c'est-à-dire que le soi-disant problème d'ambiguïté se produit, et tout le monde peut bien le comprendre.
Alors comment éviter ce problème ? C'est à ce moment-là qu'il faut utiliser des classes de base virtuelles ! La classe de base virtuelle consiste à la modifier avec virtual avant d'hériter du type public lors de l'héritage. Par exemple, dans cet exemple, la classe père n'a besoin que d'ajouter un virtual supplémentaire lors de l'héritage de la classe grand-père. La classe et la classe de base ne conserveront qu'une copie d'un objet de classe de base. Évitez les copies multiples et les ambiguïtés.
La méthode de définition consiste à ajouter une déclaration virtuelle lors de la dérivation des deux classes parentes :
classePère1 : grand-père public virtuelclasse Père2 : grand-père public virtuel
Le reste reste inchangé. Vous pouvez le tester sur votre propre ordinateur pour comprendre la génération d'ambiguïté et l'utilisation des classes de base virtuelles.