Partager via


Avertissement du compilateur (niveau 1) C4436

le dynamic_cast de base virtuelle « class1 » à « class2 » dans le constructeur ou le destructeur peut échouer avec un objet partiellement construit Compiler avec /vd2 ou définir « class2 » avec le vtordisp de #pragma (2) activé

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

  • Le lancement 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 se trouve 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.

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

Exemple

L'échantillon suivant génère C4436 et illustre le problème de génération de code qui résulte 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

Référence

dynamic_cast, opérateur

vtordisp

Avertissement du compilateur (niveau 4) C4437