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