Partager via


Avertissement du compilateur (niveau 1 et niveau 4, désactivé) C4437

dynamic_cast de la base virtuelle « base_class » à « derived_class » peut échouer dans certains contextes

Remarques

Cet avertissement est désactivé par défaut. Pour plus d'informations, consultez Compiler Warnings That Are Off by Default.

Une dynamic_cast opération est utilisée lorsque :

  • Le cast provient d’un pointeur de classe de base vers un pointeur de classe dérivé.
  • La classe dérivée hérite pratiquement de la classe de base.
  • La classe dérivée n’a pas de vtordisp champ pour la base virtuelle.
  • Le cast se trouve dans un constructeur ou un destructeur de la classe dérivée, ou dans une classe qui hérite de cette dernière. Sinon, l’avertissement du compilateur C4436 est émis à la place de C4435.

Cet avertissement indique que le dynamic_cast risque de ne pas s’exécuter correctement lorsqu’il est appliqué à un objet partiellement construit. Cette situation se produit lorsque la fonction englobante est appelée à partir d’un constructeur ou d’un destructeur d’une classe qui hérite de derived_class. Vous pouvez ignorer l’erreur si derived_class n’est jamais dérivée, ou si la fonction englobante n’est pas appelée pendant la construction ou la destruction d’objets.

Exemple

L’exemple suivant génère l’erreur C4437 et illustre le problème de génération de code qui provient du champ manquant vtordisp :

// C4437.cpp
// To see the warning and runtime assert, compile with: /W4
// To eliminate the warning and assert, compile with: /W4 /vd2
//       or compile with: /W4 /DFIX
#pragma warning(default : 4437)
#include <cassert>

struct A
{
public:
    virtual ~A() {}
};

#if defined(FIX)
#pragma vtordisp(push, 2)
#endif
struct B : virtual A
{
    B()
    {
        func();
    }

    void func()
    {
        A* a = static_cast<A*>(this);
        B* b = dynamic_cast<B*>(a);     // C4437
        assert(this == b);              // assert unless compiled with /vd2
    }
};
#if defined(FIX)
#pragma vtordisp(pop)
#endif

struct C : B
{
    int i;
};

int main()
{
    C c;
}

Voir aussi

dynamic_cast (opérateur)
vtordisp
Avertissement du compilateur (niveau 1) C4436