Partager via


Avertissement du compilateur (niveau 4) C4437

dynamic_cast de base virtuelle 'class1' à 'class2' peut échouer dans certains contextes Compiler avec /vd2 ou définir 'class2' avec #pragma vtordisp(2) en vigueur

Cet avertissement est désactivé par défaut. Consultez Avertissements du compilateur désactivés par défaut pour plus d'informations.

Le compilateur a rencontré une dynamic_cast opération avec les caractéristiques suivantes.

  • 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 est introuvable dans un constructeur ou un destructeur de la classe dérivée, ou une classe qui hérite davantage de la classe dérivée (sinon, l’avertissement du compilateur C4436 sera émis).

L’avertissement indique que le dynamic_cast fichier peut ne pas fonctionner correctement s’il fonctionne sur 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 la classe dérivée nommée dans l’avertissement. Si la classe dérivée nommée dans l’avertissement n’est jamais dérivée, ou si la fonction englobante n’est pas appelée pendant la construction ou la destruction de l’objet, l’avertissement peut être ignoré.

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