Compiler Warning (level 4) C4437
dynamic_cast dari basis virtual 'class1' ke 'class2' dapat gagal dalam beberapa konteks Dikompilasi dengan /vd2 atau menentukan 'class2' dengan #pragma vtordisp(2) berlaku
Peringatan ini nonaktif secara default. Lihat Peringatan Pengkompilasi yang Nonaktif secara Default untuk informasi selengkapnya.
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 tidak ditemukan dalam konstruktor atau destruktor kelas turunan, atau beberapa kelas yang selanjutnya mewarisi dari kelas turunan (jika tidak, peringatan kompilator C4436 akan dikeluarkan).
Peringatan menunjukkan bahwa dynamic_cast
mungkin tidak berfungsi dengan benar jika beroperasi pada objek yang dibangun sebagian. Situasi ini terjadi ketika fungsi penutup dipanggil dari konstruktor atau destruktor kelas yang mewarisi kelas turunan yang dinamai dalam peringatan. Jika kelas turunan yang dinamai dalam peringatan tidak pernah diturunkan lebih lanjut, atau fungsi penutup tidak dipanggil selama konstruksi objek atau penghancuran, peringatan dapat diabaikan.
Contoh
Sampel berikut menghasilkan C4437 dan menunjukkan masalah pembuatan kode yang muncul dari bidang yang hilang vtordisp
.
// 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;
}
Baca juga
Operator dynamic_cast
vtordisp
Compiler Warning (level 1) C4436
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk