Compiler Warning (level 1) C4436
dynamic_cast dari basis virtual 'class1' ke 'class2' dalam konstruktor atau destruktor dapat gagal dengan kompilasi objek yang dibangun sebagian dengan /vd2 atau menentukan 'class2' dengan #pragma vtordisp(2) berlaku
Pengkompilasi telah mengalami dynamic_cast
operasi dengan karakteristik berikut.
Pemeran berasal dari penunjuk kelas dasar ke penunjuk kelas turunan.
Kelas turunan mewarisi kelas dasar secara virtual.
Kelas turunan tidak memiliki
vtordisp
bidang untuk basis virtual.Pemeran ditemukan dalam konstruktor atau destruktor kelas turunan, atau beberapa kelas yang selanjutnya mewarisi dari kelas turunan.
Peringatan menunjukkan dynamic_cast
mungkin tidak berfungsi dengan benar, jika beroperasi pada objek yang dibangun sebagian. Itu terjadi jika konstruktor/destruktor turunan beroperasi pada sub-objek dari beberapa objek turunan lebih lanjut. Jika kelas turunan yang dinamai dalam peringatan tidak pernah diturunkan lebih lanjut, peringatan dapat diabaikan.
Contoh
Sampel berikut menghasilkan C4436 dan menunjukkan masalah pembuatan kode yang muncul dari bidang yang hilang vtordisp
.
// 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;
}
Lihat juga
Operator dynamic_cast
vtordisp
Compiler Warning (level 4) C4437