Avertissement du compilateur (niveau 1) C4436
le dynamic_cast de base virtuelle « classe1 » et « classe2 » dans le constructeur ou le destructeur peut échouer avec la compilation partielle générée d'objet avec /vd2 ou définir « classe2 » avec le vtordisp #pragma (2) en effet
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 trouvé 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.
L'avertissement indique dynamic_cast ne peut pas exécuter correctement, qu'il s'exécute sur un objet partielle construit.Cela se produit si le constructeur/destructeur dérivés s'exécute sur un sous-objet d'un autre objet dérivé de.Si la classe dérivée nommée dans l'avertissement n'est jamais plus dérivée de, l'avertissement peut être ignoré.
Exemple
L'exemple suivant génère C4436 et explique le problème de génération de code qui résulte du champ manque d' 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;
}