Partager via


Avertissement du compilateur (niveau 4) C4437

le dynamic_cast de la base virtuelle « class1 » à « class2 » peut échouer dans certains contextes Compilez avec /vd2 ou définissez « class2 » avec le vtordisp de #pragma (2) activé

Cet avertissement est désactivé par défaut. Pour plus d'informations, consultez Avertissements du compilateur désactivés par défaut.

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

  • Le cast consiste en un pointeur de base de la classe converti en un pointeur dérivé de la classe.

  • La classe dérivée hérite pratiquement de la classe de base.

  • La classe dérivée n'a aucun champ de vtordisp pour la base virtuelle.

  • La conversion est introuvable dans un constructeur ou un destructeur de la classe dérivée, ou d'une classe qui hérite davantage de la classe dérivée (dans le cas contraire, l'avertissement du compilateur C4436 est émis).

L'avertissement indique que le dynamic_cast peut ne pas s'exécuter correctement s'il fonctionne sur un objet construit partiellement. Cette situation se produit lorsque la fonction englobante est appelée 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 davantage, 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'échantillon suivant génère l'erreur C4437 et illustre le problème de génération de code qui résulte du champ manquant de 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

Référence

dynamic_cast, opérateur

vtordisp

Avertissement du compilateur (niveau 1) C4436