Maison > développement back-end > C++ > Erreur de syntaxe C++ : L'appel du constructeur de la classe de base est incorrect, comment y remédier ?

Erreur de syntaxe C++ : L'appel du constructeur de la classe de base est incorrect, comment y remédier ?

王林
Libérer: 2023-08-21 21:16:45
original
1663 Les gens l'ont consulté

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 :

  1. Incompatibilité de type de paramètre du constructeur de classe de base : lorsque vous appelez le constructeur de classe de base, vous devez vous assurer que les paramètres du constructeur de la classe dérivée Le type correspond au type de paramètre du constructeur de la classe de base. Si les paramètres du constructeur de la classe de base et de la classe dérivée ne correspondent pas, cela provoquera une erreur de compilation. Par exemple :
#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;
}
Copier après la connexion
  1. Le constructeur de la classe de base est appelé plusieurs fois : Lorsque vous appelez le constructeur de la classe de base dans le constructeur de la classe dérivée, vous devez vous assurer de ne l'appeler qu'une seule fois, sinon les membres de la classe de base risquent d'être initialisés plusieurs fois, provoquant une erreur. Par exemple :
#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;
}
Copier après la connexion

Le résultat de sortie est :

Base class constructor called
Derived class constructor called
Copier après la connexion

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;
}
Copier après la connexion

La sortie est :

Base class constructor called
Derived class constructor with value : 10 called
Base class constructor called
Copier après la connexion

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.

  1. Le constructeur de la classe de base n'est pas appelé : lorsque vous appelez une fonction virtuelle dans le constructeur de la classe de base, lorsque vous appelez le constructeur de la classe de base dans le constructeur de la classe dérivée, la fonction virtuelle de la classe de base ne sera pas appelée, donc peut provoquer des erreurs de programme.
#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;
}
Copier après la connexion

Le résultat de sortie est :

Derived
Copier après la connexion

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 :

  1. Vérifiez les types de paramètres : si vous rencontrez une erreur d'incompatibilité de type de paramètre lors de l'appel d'un constructeur de classe de base, vous devez vérifier si le type de données du paramètre est correct. par exemple s'il s'agit d'un type de données tel que int, double, char, etc.
  2. Vérifiez les appels du constructeur : si vous rencontrez une situation dans laquelle le constructeur de la classe de base est appelé plusieurs fois, vous devez vérifier si le constructeur de la classe de base est correctement appelé dans le constructeur de la classe dérivée et vous assurer qu'il n'est appelé qu'une seule fois.
  3. Évitez d'appeler des fonctions virtuelles dans les constructeurs de classe de base : si vous appelez des fonctions virtuelles dans des constructeurs de classe de base et que vous appelez des constructeurs de classe de base dans des constructeurs de classe dérivés, vous devez éviter d'appeler des fonctions virtuelles dans la fonction des constructeurs de classe de base. Si vous devez appeler une fonction virtuelle dans un constructeur de classe de base, vous devez utiliser des fonctions virtuelles pures ou d'autres méthodes pour éviter les erreurs.
  4. Évitez d'utiliser des pointeurs intelligents dans les constructeurs : si vous utilisez des pointeurs intelligents dans les constructeurs, vous devez éviter d'utiliser des pointeurs vers l'objet actuel dans les pointeurs intelligents. Parce que la valeur du pointeur intelligent peut être NULL avant l'initialisation de l'objet actuel, provoquant une erreur d'exécution.

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!

Étiquettes associées:
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal