Partager via


Avertissement du compilateur (niveau 1) C4436

dynamic_cast de base virtuelle « base_class » à « derived_class » dans le constructeur ou le destructeur pourrait échouer avec un objet partiellement construit

Remarques

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 une classe qui hérite de la classe dérivée.

Cet avertissement indique que la dynamic_cast valeur peut ne pas s’exécuter correctement si elle est appliquée à un objet partiellement construit. Ce qui 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 pas dérivée davantage, vous pouvez ignorer l’avertissement.

Exemple

L’exemple suivant génère l’erreur C4436 et illustre le problème de génération de code en raison 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);              // asserts 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 et niveau 4, désactivé) C4437