Delen via


Compilerwaarschuwing (niveau 1 en niveau 4, uit) C4437

dynamic_cast van 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 vtordisp geen 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