Rediger

Del via


Compiler warning (level 1) C4436

dynamic_cast from virtual base 'base_class' to 'derived_class' in constructor or destructor could fail with partially-constructed object

A dynamic_cast operation is used when:

  • The cast is from a base class pointer to a derived class pointer.
  • The derived class virtually inherits the base class.
  • The derived class doesn't have a vtordisp field for the virtual base.
  • The cast is found in a constructor or destructor of the derived class, or a class that inherits from the derived class.

This warning indicates that the dynamic_cast might not perform correctly if it is applied to a partially constructed object. Which happens if the derived constructor/destructor is operating on a subobject of some further derived object. If the derived class named in the warning isn't further derived, you can ignore the warning.

Example

The following sample generates C4436 and demonstrates the code generation issue due to the missing vtordisp field:

// 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;
}

See also

dynamic_cast Operator
vtordisp
Compiler Warning (level 1 and level 4, off) C4437