Maison >développement back-end >C++ >Pourquoi les erreurs « Pure Virtual Function Call » provoquent-elles des plantages du programme ?

Pourquoi les erreurs « Pure Virtual Function Call » provoquent-elles des plantages du programme ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 12:25:01529parcourir

Why Do

Comprendre les plantages d'« appel de fonction virtuelle pure »

En programmation, les erreurs d'« appel de fonction virtuelle pure » peuvent parfois provoquer le crash brutal des programmes. Ces erreurs surviennent lorsqu'une tentative est faite d'appeler une fonction virtuelle pure lors de la construction ou de la destruction d'un objet.

Fonctions virtuelles pures

Une fonction virtuelle pure est une fonction membre de une classe abstraite qui n'a qu'une déclaration mais pas d'implémentation. Il oblige les classes dérivées à implémenter leurs propres versions de la fonction.

Limitations du constructeur et du destructeur

Les fonctions constructeur et destructeur sont appelées respectivement lors de l'initialisation et de la destruction de l'objet. Pendant ces fonctions spéciales, les appels de fonctions virtuelles sont interdits car :

  • Les constructeurs ne peuvent pas accéder aux membres de classe dérivée qui ne sont peut-être pas encore construits.
  • Les destructeurs ne peuvent pas accéder aux membres de classe dérivée qui peuvent déjà être détruit.

Source des plantages

Des plantages d'"appel de fonction virtuelle pure" se produisent lorsque :

  • Vous appelez explicitement un pur fonction virtuelle à partir d'un constructeur ou de destructeur.
  • Vous appelez indirectement une fonction virtuelle pure via une fonction appelée à partir d'un constructeur ou de destructeur.

Exemple

Considérez ce code :

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, l'appel à RealDoIt() dans le constructeur de base tente d'appeler la fonction virtuelle pure doIt(). Puisque le constructeur est appelé, l'objet de classe dérivé n'a pas encore été construit et une erreur « appel de fonction virtuelle pure » ​​se produit.

Résolution

Pour éviter ces problèmes plante, évitez d'appeler des fonctions virtuelles pures à partir de constructeurs ou de destructeurs. Au lieu de cela, assurez-vous que les classes dérivées fournissent leurs propres implémentations avant d'appeler les fonctions virtuelles pures.

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