Aracılığıyla paylaş


Derleyici Uyarısı (düzey 4) C4437

'class1' sanal tabanından 'class2' sanal tabanına dynamic_cast bazı bağlamlarda başarısız olabilir /vd2 ile derleme veya etkin #pragma vtordisp(2) ile 'class2' tanımlama

Bu uyarı varsayılan olarak kapalıdır. Daha fazla bilgi için bkz . Varsayılan Olarak Kapalı Olan Derleyici Uyarıları.

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.

  • Türetilmiş sınıfın oluşturucusunda veya yok edicisinde veya türetilmiş sınıftan daha fazla devralan bir sınıfta (aksi takdirde derleyici uyarısı C4436 verilir) bulunamadı.

Uyarı, kısmen oluşturulduğunda bir nesne üzerinde çalışıyorsa doğru şekilde çalışmayabileceğini belirtir dynamic_cast . Bu durum, kapsayan işlev uyarıda adlandırılan türetilmiş sınıfı devralan bir sınıfın oluşturucusundan veya yıkıcısından çağrıldığında oluşur. Uyarıda adlandırılan türetilmiş sınıf hiçbir zaman daha fazla türetilmemişse veya nesne oluşturma veya yok etme sırasında kapsayan işlev çağrılmazsa, uyarı yoksayılabilir.

Örnek

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

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

Ayrıca bkz.

dynamic_cast İşleci
vtordisp
Derleyici Uyarısı (düzey 1) C4436