Avertissement du compilateur (niveau 4) C4437
le dynamic_cast de base virtuelle « classe1 » et « classe2 » peut échouer dans la compilation de certains contextes avec /vd2 ou définir « classe2 » avec le vtordisp #pragma (2) en effet
Cet avertissement est désactivé par défaut.Consultez Avertissements du compilateur qui sont éteints par défaut pour plus d'informations.
Le compilateur a rencontré une opération d' dynamic_cast avec les caractéristiques suivantes.
Le cast est d'un pointeur de classe de base à un pointeur de classe dérivée.
La classe dérivée hérite pratiquement la classe de base.
La classe dérivée n'a pas un champ d' vtordisp pour la base virtuelle.
Le cast est introuvable dans un constructeur ou un destructeur de la classe dérivée, ou une classe qui hérite plus loin de la classe dérivée (sinon, l'avertissement du compilateur C4436 est émis).
L'avertissement indique qu' dynamic_cast ne peut pas exécuter correctement s'il s'exécute sur un objet partielle construit.Cette situation se produit lorsque la fonction englobante est appelée d'un constructeur ou 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 plus dérivée de, ou la fonction englobante n'est pas appelée pendant la construction d'objet ou la destruction, l'avertissement peut être ignoré.
Exemple
L'exemple suivant génère C4437 et explique le problème de génération de code qui résulte du champ manque d' 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;
}