Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
dynamic_castegyes környezetekben sikertelen lehet a "base_class" virtuális alaposztályról "derived_class"-ra való átmenet
Megjegyzések
Ez a figyelmeztetés alapértelmezés szerint ki van kapcsolva. További információ: A fordító alapértelmezés szerint ki van kapcsolva.
A dynamic_cast művelet akkor használatos, ha:
- A kasztolás egy alaposztály mutatójáról egy származtatott osztály mutatójára történik.
- A származtatott osztály gyakorlatilag örökli az alaposztályt.
- A származtatott osztálynak nincs
vtordispmezője a virtuális bázishoz. - A leadás a származtatott osztály konstruktorában vagy destruktorában, illetve a származtatott osztálytól öröklő osztályban található. Ellenkező esetben a C4436 fordító figyelmeztetést ad ki a C4435-ről.
Ez a figyelmeztetés azt jelzi, hogy a dynamic_cast nem biztos, hogy megfelelően működik, amikor egy részben létrehozott objektumra alkalmazzák. Ez a helyzet akkor fordul elő, ha a beágyazási függvényt egy olyan osztály konstruktorából vagy destruktorából hívjuk meg, amely derived_class örököl. Figyelmen kívül hagyhatja a hibát, ha derived_class soha nem származik tovább, vagy az objektumépítés vagy -megsemmisítés során nem hívja meg a beágyazási függvényt.
Example
Az alábbi példa létrehozza a C4437-et, és bemutatja a hiányzó vtordisp mezőből eredő kódgenerálási problémát:
// 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;
}
Lásd még
dynamic_cast Operátor
vtordisp
Fordító figyelmeztetés (1. szint) C4436