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