Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens des erreurs « Appel de fonction virtuelle pure » ​​dans les constructeurs et les destructeurs ?

Pourquoi est-ce que j'obtiens des erreurs « Appel de fonction virtuelle pure » ​​dans les constructeurs et les destructeurs ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-15 07:12:02382parcourir

Why Do I Get

Erreurs fatales « d'appel de fonction virtuelle pure » : démêler leurs racines

Il peut être déroutant de rencontrer des plantages de programme avec la « fonction virtuelle pure » call", en particulier lorsque la classe affectée est abstraite et doit donc interdire la création d'objets. Cet article vise à faire la lumière sur les causes sous-jacentes de ces erreurs et à fournir une explication complète.

Appels de fonctions virtuelles dans les classes abstraites

Les fonctions virtuelles permettent aux classes dérivées de remplacer implémentations de classes de base, permettant le polymorphisme. Cependant, dans les classes abstraites, certaines fonctions désignées comme « fonctions virtuelles pures » n'ont aucune implémentation dans la classe de base. Au lieu de cela, ils servent d'espaces réservés, obligeant toutes les classes dérivées à fournir leurs propres implémentations. Une classe abstraite sans au moins une fonction virtuelle pure peut être instanciée, mais les appels à des fonctions virtuelles pures provoqueront une erreur d'exécution.

"Pure Virtual Function Call" Crashes

Cependant, un scénario inattendu peut se produire lorsqu'un appel de fonction virtuelle est tenté depuis un constructeur ou un destructeur. En raison des contraintes de construction et de destruction d'objets, les appels de fonctions virtuelles ne sont pas autorisés à ces étapes. Par conséquent, la version de classe de base de la fonction virtuelle est invoquée à la place, ce qui dans le cas d'une fonction virtuelle pure est inexistante, déclenchant un crash d'exécution.

Exemple d'illustration

Considérez l'extrait de code suivant :

class Base
{
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base
{
    void doIt() {}
};

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}

Dans cet exemple, une tentative d'invocation d'une fonction virtuelle (doIt()) à partir du Le constructeur de la classe de base abstraite (Base) entraîne une erreur « appel de fonction virtuelle pure » ​​lorsque l'objet de classe dérivée (d) est créé. Puisqu'il n'y a pas d'implémentation pour doIt() dans Base, l'appel passe à l'espace réservé de la fonction virtuelle pure, qui n'est pas valide.

Conclusion

"Fonction virtuelle pure call" se produisent lorsque des appels de fonctions virtuelles sont effectués par erreur à partir de constructeurs ou de destructeurs. Comprendre cette limitation est crucial pour éviter ces crashs et assurer le bon fonctionnement des classes abstraites. Pour plus d'informations, reportez-vous aux articles éclairants de Raymond Chen sur le sujet.

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!

Déclaration:
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