Bagikan melalui


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