Maison > développement back-end > C++ > Pourquoi des plantages d'« appel de fonction virtuelle pure » se produisent-ils dans les constructeurs et les destructeurs ?

Pourquoi des plantages d'« appel de fonction virtuelle pure » se produisent-ils dans les constructeurs et les destructeurs ?

DDD
Libérer: 2024-11-11 17:28:02
original
604 Les gens l'ont consulté

Why Do

Dévoilement de l'énigme des plantages « d'appel de fonction virtuelle pure »

Lorsqu'ils rencontrent le message d'erreur cryptique « appel de fonction virtuelle pure », les utilisateurs peuvent Je me demande comment les programmes parviennent à compiler malgré l'incapacité d'instancier des objets de classes abstraites. Ce problème provient des tentatives d'invocation de fonctions virtuelles au sein de constructeurs ou de destructeurs.

Le dilemme du compilateur :

Lors de la création d'un objet, un constructeur est responsable de l'initialisation de l'état de l'objet. À l’inverse, un destructeur gère la destruction d’objets. Cependant, les appels de fonction virtuelle ne peuvent pas être effectués au cours de ces étapes car l'objet de classe dérivé est soit incomplet, soit inexistant.

Dans de tels cas, le compilateur invoque la version de classe de base de la fonction virtuelle. Cependant, comme les fonctions virtuelles pures n'ont pas d'implémentation dans la classe de base, cela entraîne la fameuse erreur « appel de fonction virtuelle pure ».

Un extrait de code pour illustrer :

Considérons l'exemple C suivant :

class Base {
public:
    Base() {
        reallyDoIt(); // INCORRECT, doesn't work
    }
    void reallyDoIt() { doIt(); } // INCORRECT, doesn't work
    virtual void doIt() = 0; // Pure virtual function
};

class Derived : public Base {
    void doIt() {} // Overrides pure virtual function
};

int main() {
    Derived d; // Causes "pure virtual function call" error
}
Copier après la connexion

Lors de l'instanciation de la classe Derived, le programme tente d'appeler RealDoIt() à partir du constructeur, qui à son tour invoque doIt(). Puisque doIt() est une fonction virtuelle pure, il n'y a pas d'implémentation dans la classe de base, ce qui conduit à l'erreur fatale.

Conclusion :

Pour éviter les « fonctions virtuelles pures function call" plante, il est crucial d'éviter de faire des appels de fonctions virtuelles au sein des constructeurs ou des destructeurs. Cela garantit que seules les méthodes spécifiques à la classe dérivée sont appelées lors de la création et de la destruction d'objets, empêchant ainsi les invocations de fonctions non définies dans 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!

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