L'héritage virtuel résout le « problème du diamant » dans l'héritage multiple, lorsqu'une classe hérite de deux ou plusieurs sous-classes avec la même classe de base. En utilisant le mot-clé virtual dans la spécification d'héritage d'une classe dérivée, la classe dérivée n'obtient pas de copie de la classe de base, mais accède indirectement aux méthodes de la classe de base via des pointeurs. De cette façon, la classe dérivée n’obtient qu’une seule méthode de la classe qui dérive finalement de la classe de base, évitant ainsi toute ambiguïté.
Explication détaillée des fonctions membres C++ : héritage virtuel et problème de diamant des méthodes objet
L'héritage virtuel est un mécanisme d'héritage qui résout le "problème de diamant" dans l'héritage multiple. Le problème du diamant se produit lorsqu'une classe hérite simultanément de deux ou plusieurs sous-classes ayant la même classe de base.
Exemple pratique :
Considérez l'extrait de code suivant :
class Animal { public: virtual void makeSound() { cout << "Animal makes a sound" << endl; } }; class Cat : public Animal { public: virtual void makeSound() { cout << "Cat meows" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "Dog barks" << endl; } }; class Siamese : public Cat, public Dog { // 钻石问题 };
En suivant les règles d'héritage normales, la classe Siamois
sera dérivée de Cat
et Dog </code > Chaque classe hérite d'une méthode <code>makeSound()
. Cependant, cela conduit à une ambiguïté lors de l'appel de la méthode makeSound()
, puisqu'il existe deux méthodes portant le même nom dans la classe Siamese
. Siamese
类将从 Cat
和 Dog
类分别继承一个 makeSound()
方法。然而,这会导致在调用 makeSound()
方法时产生歧义,因为 Siamese
类中存在两个同名方法。
解决钻石问题:
为了解决钻石问题,我们可以使用虚继承。在虚继承中,派生类不会获得基类的实际副本,而是通过一个指针间接访问基类的方法。
要使用虚继承,请在派生类继承规范中使用 virtual
关键字:
class Siamese : public virtual Cat, public virtual Dog { };
这样,Siamese
类将只获得一个 makeSound()
方法,该方法来自最终从 Animal
类中派生的类 (Cat
或 Dog
中的一个)。
输出:
Siamese siamese; siamese.makeSound(); // Cat meows
在上面的示例中,Siamese
类从 Cat
类继承了 makeSound()
方法,因为它是第一个从 Animal
virtual
dans la spécification d'héritage de classe dérivée : 🎜rrreee🎜De cette façon, la classe siamois
n'obtiendra qu'un seul makeSound()
à partir d'une classe qui dérive finalement de la classe Animal
(soit Cat
ou Dog
). 🎜🎜🎜Sortie : 🎜🎜rrreee🎜Dans l'exemple ci-dessus, la classe Siamese
hérite de la méthode makeSound()
de la classe Cat
car elle Est la première classe de base dérivée de la classe Animal
. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!