Erreur de syntaxe C++ : L'appel du constructeur de la classe de base est incorrect, comment y remédier ?
En programmation C++, nous rencontrons souvent des situations où des constructeurs de classes de base sont appelés. Cependant, au cours de ce processus, il arrive parfois que le constructeur de la classe de base soit appelé de manière incorrecte. Cette situation entraîne souvent une fermeture anormale du programme ou une erreur inconnue. Si vous rencontrez cette situation, ne paniquez pas. Cet article vous donnera une introduction détaillée à l'appel incorrect du constructeur de classe de base et à la manière de le gérer.
1. Appel incorrect du constructeur de la classe de base
En C++, le constructeur d'une classe dérivée doit appeler le constructeur de sa classe de base pour s'assurer que tous les membres de la classe de base sont correctement initialisés. De manière générale, il s'agit de la méthode la plus courante pour appeler le constructeur de classe de base dans la liste d'initialisation des membres du constructeur de classe dérivée. Cependant, lorsque vous faites une erreur en appelant un constructeur de classe de base, il arrive que le constructeur de classe de base soit appelé de manière incorrecte. Vous trouverez ci-dessous plusieurs situations courantes dans lesquelles les appels du constructeur de classe de base sont incorrects :
#include<iostream> using namespace std; class Base{ public: Base(){} Base(int a){ cout<<"Base class with value : "<<a<<" ";} }; class Derived: public Base{ public: Derived(){} Derived(int a){ cout<<"Derived class with value : "<<a<<" ";} }; int main(){ Derived d(10); // 编译错误:没有与此调用匹配的函数 return 0; }
#include<iostream> using namespace std; class Base{ public: Base(){ cout<<"Base class constructor called "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived class constructor called "; } Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called "; } }; int main(){ Derived d; return 0; }
Le résultat de sortie est :
Base class constructor called Derived class constructor called
Dans le code ci-dessus, le constructeur de la classe Derived appelle le constructeur de la classe Base, donc "Constructeur de classe de base appelé" est affiché, mais comme la classe Derived a un seul constructeur, donc le constructeur sans paramètre est appelé par défaut, donc "Constructeur de classe dérivé appelé" est également affiché. Si vous appelez deux fois le constructeur de la classe de base, vous obtiendrez une erreur :
#include<iostream> using namespace std; class Base{ public: Base(){ cout<<"Base class constructor called "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived class constructor called "; } Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called "; } }; int main(){ Derived d(10); return 0; }
La sortie est :
Base class constructor called Derived class constructor with value : 10 called Base class constructor called
Parce que le constructeur de la classe Base est appelé deux fois dans le constructeur de la classe Derived, il est affiché deux fois "Classe de base constructeur appelé". En effet, en C++, le processus de construction d'un objet de classe dérivée appelle d'abord le constructeur de classe de base, puis appelle le constructeur de classe dérivée. Par conséquent, si vous appelez deux fois le constructeur de la classe de base dans le constructeur de la classe dérivée, le constructeur de la classe de base sera appelé deux fois, provoquant une erreur.
#include<iostream> using namespace std; class Base{ public: Base(){ f(); } virtual void f(){ cout<<"Base "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived "; } void f(){ cout<<"Derived "; } }; int main(){ Derived d; return 0; }
Le résultat de sortie est :
Derived
Dans le programme ci-dessus, la fonction f() dans le constructeur de la classe de base est une fonction virtuelle, et lorsqu'un objet dérivé est créé, le constructeur de la classe dérivée appelle d'abord le constructeur de la classe de base, donc la fonction f() de la classe Base est appelée. Cependant, lorsque f() est appelé dans le constructeur de la classe de base, le constructeur de l'objet de classe dérivé n'a pas encore été exécuté, donc la fonction f() dans la classe dérivée n'a pas encore été appelée, seule la fonction f() de la classe de base a été appelée. Par conséquent, le résultat est « Base » au lieu de « Dérivé ».
2. Comment gérer l'appel incorrect du constructeur de la classe de base ?
Si vous rencontrez un appel incorrect au constructeur de la classe de base, comment devez-vous le gérer ? Vous trouverez ci-dessous plusieurs façons de gérer les appels incorrects du constructeur de classe de base :
En bref, lorsque vous rencontrez un appel incorrect au constructeur de la classe de base, ne paniquez pas. Vous devez vérifier attentivement l'erreur et la gérer selon les méthodes de traitement ci-dessus. De cette façon, vous pouvez efficacement éviter les erreurs d’exécution du programme causées par des appels incorrects au constructeur de la classe de base.
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!