Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
dynamic_castvan virtuele basis 'base_class' naar 'derived_class' kan in sommige contexten mislukken
Opmerkingen
Deze waarschuwing is standaard uitgeschakeld. Zie Compilerwaarschuwingen die standaard zijn uitgeschakeld voor meer informatie.
Een dynamic_cast bewerking wordt gebruikt wanneer:
- De cast is van een basisklassepointer naar een afgeleide klassepointer.
- De afgeleide klasse neemt de basisklasse virtueel over.
- De afgeleide klasse heeft
vtordispgeen veld voor de virtuele basis. - De cast wordt gevonden in een constructor of destructor van de afgeleide klasse, of een klasse die van de afgeleide klasse erft. Anders wordt de compilerwaarschuwing C4436 uitgegeven door C4435.
Deze waarschuwing geeft aan dat het mogelijk niet correct presteert wanneer deze dynamic_cast wordt toegepast op een gedeeltelijk samengesteld object. Deze situatie treedt op wanneer de omsluitfunctie wordt aangeroepen vanuit een constructor of destructor van een klasse die wordt overgenomen van derived_class. U kunt de fout negeren als derived_class nooit verder wordt afgeleid of de omsluitfunctie niet wordt aangeroepen tijdens de constructie of vernietiging van objecten.
Example
In het volgende voorbeeld wordt C4437 gegenereerd en wordt het probleem met het genereren van code gedemonstreert dat optreedt in het ontbrekende vtordisp veld:
// 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;
}
Zie ook
dynamic_cast Bediener
vtordisp
Compilerwaarschuwing (niveau 1) C4436