Partager via


Avertissement du compilateur (niveau 1) C4436

dynamic_cast de la base virtuelle 'class1' à 'class2' dans le constructeur ou le destructeur peut échouer avec l’objet compilé partiellement construit avec /vd2 ou définir 'class2' avec #pragma vtordisp(2) en vigueur

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 se trouve dans un constructeur ou un destructeur de la classe dérivée, ou dans une classe qui hérite davantage de la classe dérivée.

L’avertissement indique que le dynamic_cast risque de ne pas s’exécuter correctement, s’il fonctionne sur un objet partiellement construit. Cela se produit si le constructeur/destructeur dérivé fonctionne sur un sous-objet d’un autre objet dérivé. Si la classe dérivée nommée dans l’avertissement n’est jamais dérivée, l’avertissement peut être ignoré.

Exemple

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

// C4436.cpp
// To see the warning and runtime assert, compile with: /W1
// To eliminate the warning and assert, compile with: /W1 /vd2
//       or compile with: /W1 /DFIX
#include <cassert>

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

#if defined(FIX)
#pragma vtordisp(push, 2)
#endif
struct B : virtual A
{
    B()
    {
        A* a = static_cast<A*>(this);
        B* b = dynamic_cast<B*>(a);     // C4436
        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 4) C4437