Maison > développement back-end > C++ > Erreur de syntaxe C++ : un destructeur virtuel doit être défini, comment y faire face ?

Erreur de syntaxe C++ : un destructeur virtuel doit être défini, comment y faire face ?

WBOY
Libérer: 2023-08-22 17:13:46
original
1437 Les gens l'ont consulté

Erreur de syntaxe C++ : un destructeur virtuel doit être défini, comment y faire face ?

C++ est un langage de programmation fortement typé largement utilisé dans le développement de diverses applications informatiques. Contrairement à de nombreux autres langages de programmation, C++ permet l'utilisation de fonctions virtuelles et de destructeurs virtuels pour créer un polymorphisme, une fonctionnalité qui joue un rôle important dans la programmation orientée objet.

Cependant, lorsque vous écrivez des programmes C++, vous pouvez rencontrer diverses erreurs de syntaxe. Une erreur courante est de croire que des destructeurs virtuels doivent être définis. Un destructeur virtuel est une fonction virtuelle déclarée dans une classe de base dont le but est de garantir que la mémoire est correctement libérée lors de la destruction d'un objet de classe dérivée. Si un destructeur virtuel n'est pas défini ou est mal défini, une erreur se produira.

Alors, comment devrions-nous gérer cette erreur ? Voici quelques solutions possibles :

1. Ajouter une définition pour le destructeur virtuel

Si vous obtenez le message d'erreur indiquant qu'un destructeur virtuel doit être défini, la solution la plus simple est d'ajouter une définition pour le destructeur virtuel. Ceci peut être réalisé en ajoutant une définition de fonction dans le fichier de déclaration de la classe de base.

Par exemple, considérons le code suivant :

class Base {
public:
  virtual ~Base() = 0;
};

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

int main() {
  Base* b = new Derived();
  delete b;
}
Copier après la connexion

Dans cet exemple, la classe de base Base déclare un destructeur virtuel, mais ne fournit pas d'implémentation concrète. Dans la classe Derived, nous fournissons un destructeur, mais la fonction n'est pas virtuelle. Lorsque nous créons un objet dérivé dans le programme et le supprimons à l'aide de l'opérateur delete, le compilateur génère un message d'erreur de "référence non définie à `vtable pour Base'". En effet, nous n'avons pas fourni la définition correcte de la fonction virtuelle de la classe de base.

Pour résoudre ce problème, nous pouvons fournir une définition du destructeur virtuel dans le fichier de déclaration de la classe de base, par exemple :

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}
Copier après la connexion

Cela fournira une implémentation de base et garantira que le compilateur peut lier correctement le programme.

2. Déclarer le destructeur virtuel comme fonction virtuelle pure

Une autre solution consiste à déclarer le destructeur virtuel comme fonction virtuelle pure. Ceci peut être réalisé en utilisant "=0" dans la classe de base. Déclarer une fonction virtuelle pure signifie que la fonction doit être définie dans une classe dérivée.

Par exemple, nous pouvons déclarer un destructeur virtuel dans la classe de base comme suit :

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

int main() {
  Base* b = new Derived();
  delete b;
}
Copier après la connexion

Ici, le destructeur virtuel est déclaré comme une fonction virtuelle pure, et seule une définition de base est fournie dans la classe de base. La classe Derived n'a pas besoin de fournir son propre destructeur car le destructeur virtuel hérité de la classe de base sera appelé.

3. Vérifiez si le destructeur de classe dérivé appelle correctement le destructeur de classe de base

Si la définition du destructeur virtuel est correcte, mais qu'il y a toujours une erreur "référence non définie à `vtable pour Base'", c'est peut-être parce que le destructeur de la classe dérivée n'appelle pas correctement le destructeur de la classe de base.

Par exemple, supposons que nous modifions le destructeur de la classe dérivée par le code suivant :

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};
Copier après la connexion
Copier après la connexion

Cela amènera le compilateur à générer le même message d'erreur qu'avant. Pour résoudre ce problème, nous devons modifier le destructeur de la classe Derived avec le code suivant :

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};
Copier après la connexion
Copier après la connexion

Cela garantira que le destructeur de la classe de base est appelé correctement, libérant ainsi la mémoire.

Pour résumer, c'est une erreur de syntaxe C++ courante selon laquelle un destructeur virtuel doit être défini. Si vous rencontrez cette erreur, vous pouvez résoudre le problème en ajoutant une définition pour le destructeur virtuel, en le déclarant comme une fonction virtuelle pure ou en vérifiant si le destructeur de classe dérivée appelle correctement le destructeur de classe de base. Quelle que soit la méthode utilisée, vous devez vous assurer que le programme libère correctement la mémoire, ce qui joue un rôle clé dans la conception du programme.

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