Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
dynamic_castKurucu veya yıkıcı işlevde 'base_class' sanal tabanından 'derived_class' öğesine kısmen oluşturulmuş bir nesne ile dönüştürme başarısız olabilir
Açıklamalar
İşlem dynamic_cast şu durumlarda kullanılır:
- 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
vtordispalanı yoktur. - Atama, türetilmiş sınıfın oluşturucusunda veya yok edicisinde ya da türetilmiş sınıftan devralan bir sınıfta bulunur.
Bu uyarı, dynamic_cast kısmen oluşturulmuş bir nesneye uygulandığında düzgün çalışmayabileceğini belirtir. 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 adı geçen türetilmiş sınıf başka sınıflar tarafından türetilmemişse, uyarıyı yoksayabilirsiniz.
Örnek
Aşağıdaki örnek C4436 oluşturur ve eksik vtordisp alan nedeniyle 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); // asserts 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 ve düzey 4, kapalı) C4437