Maison > développement back-end > C++ > Comment l'héritage virtuel en C gère-t-il l'initialisation de la classe de base dans les problèmes Diamond ?

Comment l'héritage virtuel en C gère-t-il l'initialisation de la classe de base dans les problèmes Diamond ?

Patricia Arquette
Libérer: 2024-12-19 22:18:11
original
313 Les gens l'ont consulté

How Does Virtual Inheritance in C   Handle Base Class Initialization in Diamond Problems?

Comprendre l'héritage virtuel en C

Lorsqu'il s'agit de hiérarchies d'héritage complexes, C propose l'héritage virtuel comme mécanisme pour résoudre les problèmes de diamant, des situations où une classe dérivée hérite de la même classe de base via plusieurs chemins. Cependant, l'utilisation de l'héritage virtuel peut parfois entraîner des erreurs de compilation inattendues.

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

Lors de la compilation de ce code, GCC signale une erreur à la ligne indiquée. L'erreur vient du fait que la classe C ne fournit pas d'initialisation pour Base. Les classes de base virtuelles sont initialisées uniquement par la classe la plus dérivée pour laquelle elles sont visibles. Dans ce cas, ce serait la classe C.

Le constructeur par défaut de Base n'est pas invoqué lors de l'initialisation car une classe de base virtuelle n'est jamais directement héritée. Il doit être initialisé via une liste d'initialisation ou en l'attribuant à un autre objet du même type ou dérivé. Dans ce cas, la classe C ne spécifie pas d'initialisation pour Base, ce qui entraîne une erreur de compilation.

Pour résoudre ce problème, le code doit être modifié pour inclure une initialisation explicite pour Base dans le constructeur de la classe C. Ceci peut être obtenu en remplaçant le constructeur C par ce qui suit :

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

En initialisant explicitement Base dans le constructeur de classe C, le compilateur peut désormais gérer correctement l'héritage virtuel et compiler avec succès le code.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal