Share via


Derleyici Uyarısı (düzey 1) C4436

Oluşturucuda veya yıkıcıda 'class1' sanal tabanından 'class2' öğesine dynamic_cast kısmen oluşturulmuş nesneyle başarısız olabilir /vd2 ile derleme veya etkin #pragma vtordisp(2) ile 'class2' tanımlama

Derleyici aşağıdaki özelliklere sahip bir dynamic_cast işlemle karşılaştı.

  • Atama, temel sınıf işaretçisinden türetilmiş bir sınıf işaretçisine kadardır.

  • Türetilmiş sınıf, temel sınıfı sanal olarak devralır.

  • Türetilmiş sınıfın sanal taban için bir vtordisp alanı yok.

  • Atama, türetilmiş sınıfın oluşturucusunda veya yok edicisinde ya da türetilmiş sınıftan daha fazla devralan bir sınıfta bulunur.

Uyarı, kısmen oluşturulduğunda bir nesne üzerinde çalışıyorsa doğru çalışmayabileceğini gösterir dynamic_cast . Bu durum, türetilmiş oluşturucu/yıkıcı başka türetilmiş bir nesnenin alt nesnesi üzerinde çalışıyorsa gerçekleşir. Uyarıda adlı türetilmiş sınıf hiçbir zaman daha fazla türetilmezse, uyarı yoksayılabilir.

Örnek

Aşağıdaki örnek C4436 oluşturur ve eksik vtordisp alandan kaynaklanan kod oluşturma sorununu gösterir.

// 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);              // assert unless compiled with /vd2
    }
};
#if defined(FIX)
#pragma vtordisp(pop)
#endif

struct C : B
{
    int i;
};

int main()
{
    C c;
}

Ayrıca bkz.

dynamic_cast İşleci
vtordisp
Derleyici Uyarısı (düzey 4) C4437