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" i konstruktorn eller destruktören kan misslyckas med delvis konstruerat objekt
Anmärkningar
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.
Den här varningen anger att den dynamic_cast kanske inte fungerar korrekt om den tillämpas på ett delvis konstruerat objekt. Vilket händer om den härledda konstruktorn/destruktorn verkar på ett delobjekt av ett vidare härlett objekt. Om den härledda klassen som nämns i varningen inte är ytterligare härledd kan du ignorera varningen.
Example
I följande exempel genereras C4436 och kodgenereringsproblemet visas på grund av att fältet saknas 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;
}
Se även
dynamic_cast Operatör
vtordisp
Kompilatorvarning (nivå 1 och nivå 4, av) C4437