Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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