Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
dynamic_castde 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
vtordispchamp 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