Bagikan melalui


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