Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
dynamic_castfrån den virtuella basen "base_class" till "derived_class" kan misslyckas i vissa sammanhang
Anmärkningar
Den här varningen är inaktiverad som standard. Mer information finns i Kompilatorvarningar som är inaktiverade som standard.
En dynamic_cast åtgärd används när:
- Typomvandlingen är från en basklasspekare till en härledd klasspekare.
- Den härledda klassen ärver praktiskt taget basklassen.
- Den härledda klassen har
vtordispinget fält för den virtuella basen. - Typomvandlingen finns i en konstruktor eller destruktor av subklassen, eller en klass som ärver från subklassen. Annars skickas kompilatorvarning C4436 ut från C4435.
Den här varningen anger att
Example
Följande exempel genererar C4437 och visar det problem med kodgenerering som uppstår från det saknade vtordisp fältet:
// 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;
}
Se även
dynamic_cast Operatör
vtordisp
Kompilatorvarning (nivå 1) C4436