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 ?
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 /* ... */ };
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) {} /* ... */ };
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!