Héritage virtuel C : résolution de l'ambiguïté du constructeur pour plusieurs bases virtuelles
Le code donné, présentant les classes de base virtuelles A et B héritées par la classe dérivée C, rencontre une erreur de compilation lors de la tentative de construction d'une instance de C. Bien que C n'hérite de Base qu'indirectement via A et B, GCC soulève un problème pour trouver le constructeur correct pour que la classe de base s'initialise.
Comprendre l'initialisation de la classe de base virtuelle
Les classes de base virtuelles diffèrent par leur processus d'initialisation. Au lieu d'être gérée par des classes de base intermédiaires, l'initialisation de la base virtuelle est déléguée à la classe la plus dérivée. Lors de la construction d'une classe dérivée qui hérite de plusieurs bases virtuelles, comme C dans ce cas, le compilateur est confronté au défi de sélectionner l'initialiseur approprié pour la base virtuelle.
Résoudre l'ambiguïté
Pour résoudre cette ambiguïté, la classe la plus dérivée doit initialiser explicitement la classe de base virtuelle dans sa liste d'initialisation des membres. Dans ce cas, C doit inclure les éléments suivants dans son constructeur :
C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}
En initialisant explicitement Base dans le constructeur, vous demandez au compilateur d'utiliser le constructeur par défaut pour Base, garantissant ainsi une initialisation correcte.
Disponibilité du constructeur par défaut
Il est important de se rappeler qu'une classe de base virtuelle doit avoir un accès et constructeur implicite par défaut. Si aucun constructeur par défaut n'est disponible ou accessible, la compilation échouera.
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!