Maison > développement back-end > C++ > Comment l'héritage virtuel résout-il plusieurs problèmes d'initialisation de constructeurs d'héritage en C ?

Comment l'héritage virtuel résout-il plusieurs problèmes d'initialisation de constructeurs d'héritage en C ?

DDD
Libérer: 2024-12-13 05:03:14
original
224 Les gens l'ont consulté

How Does Virtual Inheritance Solve Multiple Inheritance Constructor Initialization Problems in C  ?

Héritage virtuel en C

Lorsqu'il s'agit d'héritage multiple en C, comprendre l'héritage virtuel est crucial. Considérez l'extrait de code suivant :

class Base {
public:
  Base(Base* pParent);
  /* implements basic stuff */
};

class A : virtual public Base {
public:
  A(A* pParent) : Base(pParent) {}
  /* ... */
};

class B : virtual public Base {
public:
  B(B* pParent) : Base(pParent) {}
  /* ... */
};

class C : public A, public B {
public:
  C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here
  /* ... */
};
Copier après la connexion

Dans cet exemple, C hérite à la fois de A et de B, qui à leur tour héritent virtuellement de Base. GCC génère une erreur de compilation au niveau de la ligne marquée car il ne peut pas déterminer quel constructeur appeler pour la classe Base.

Explication :

Les classes de base virtuelles ont un mécanisme d'initialisation unique . Contrairement aux classes de base non virtuelles, les classes de base virtuelles ne sont pas initialisées par les classes de base intermédiaires mais par la classe la plus dérivée. En effet, dans une hiérarchie d'héritage diamant, chaque classe de base n'est définie qu'une seule fois et ne doit être initialisée qu'une seule fois par la classe la plus dérivée.

Dans notre exemple, C est la classe la plus dérivée. Cependant, il n’initialise pas explicitement la classe Base dans son constructeur. Par conséquent, GCC tente d'utiliser le constructeur par défaut de Base. Cependant, comme C n'hérite pas directement de Base, le constructeur par défaut n'est pas accessible, entraînant l'erreur de compilation.

Solution :

Pour résoudre ce problème, le Le constructeur de C doit explicitement initialiser la classe Base à l'aide d'un initialiseur de base virtuel :

class C : public A, public B {
public:
  C(C* pParent) : A(pParent), B(pParent), Base(pParent) {}
  /* ... */
};
Copier après la connexion

En incluant l'appel Base(pParent) dans le constructeur de C, nous spécifions explicitement le constructeur Base à utiliser, garantissant que Base est correctement initialisé.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal