Maison > développement back-end > C++ > Pourquoi l'héritage virtuel provoque-t-il des erreurs d'initialisation du constructeur en C ?

Pourquoi l'héritage virtuel provoque-t-il des erreurs d'initialisation du constructeur en C ?

Susan Sarandon
Libérer: 2024-12-13 14:16:10
original
284 Les gens l'ont consulté

Why Does Virtual Inheritance Cause Constructor Initialization Errors in C  ?

Héritage virtuel et initialisation du constructeur

L'héritage virtuel est une technique utilisée en C pour résoudre l'ambiguïté de l'héritage multiple. Lorsqu'une classe hérite de plusieurs classes de base ayant le même membre, l'héritage virtuel garantit qu'une seule copie de ce membre est créée, réduisant ainsi la surcharge de mémoire.

Cependant, l'héritage virtuel introduit une situation unique lorsqu'il s'agit de à l'initialisation du constructeur. Dans l'exemple fourni, nous avons trois classes : Base, A et B, où A et B héritent virtuellement de Base. La classe C hérite alors à la fois de A et de B.

Le problème

Dans le constructeur de la classe C, une erreur se produit lors de l'initialisation de Base. Le compilateur ne peut pas faire correspondre l'appel de fonction à Base() car C n'hérite pas directement de Base. Alors pourquoi cette erreur se produit-elle ?

Comprendre l'initialisation des classes de base virtuelles

Les classes de base virtuelles ont un processus d'initialisation différent de celui des classes de base non virtuelles. Lorsqu’une classe de base virtuelle est héritée, il incombe à la classe la plus dérivée de l’initialiser. Dans ce cas, la classe C est la classe la plus dérivée et elle doit initialiser la classe de base virtuelle Base.

Comme Base n'a pas d'instance directe de C, elle ne peut pas être initialisée à l'aide des constructeurs A ou B. Au lieu de cela, Base doit être initialisé à l’aide de son constructeur par défaut. Cependant, le code fourni n'inclut pas le constructeur par défaut pour Base.

La solution

Pour résoudre ce problème, vous devez définir un constructeur par défaut dans la classe Base. , comme ceci :

class Base {
public:
  Base() = default; // Default constructor added
  Base(Base* pParent);
  /* implements basic stuff */
};
Copier après la connexion

Ce constructeur par défaut sera utilisé pour initialiser la variable membre virtuel Base dans la classe C.

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