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
Patricia Arquetteoriginal
2024-12-19 22:18:11319parcourir

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
  /* ... */
};

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
  /* ... */
};

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!

Déclaration:
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