Avviso del compilatore (livello 4) C4437
dynamic_cast dalla base virtuale 'class1' a 'class2' potrebbe non riuscire in alcuni contesti Compilare con /vd2 o definire 'class2' con #pragma vtordisp(2) in vigore
Per impostazione predefinita, questo avviso non è attivo. Per altre informazioni, vedere Avvisi del compilatore disattivati per impostazione predefinita .
Il compilatore ha rilevato un'operazione dynamic_cast
con le seguenti caratteristiche.
Il cast ha origine da un puntatore della classe base a un puntatore della classe derivata.
La classe derivata eredita virtualmente la classe base.
La classe derivata non include un campo
vtordisp
per la base virtuale.Il cast non viene trovato in un costruttore o distruttore della classe derivata o in una classe che eredita ulteriormente dalla classe derivata (in caso contrario, verrà generato l'avviso del compilatore C4436).
L'avviso indica che l'oggetto dynamic_cast
potrebbe non funzionare correttamente se opera su un oggetto parzialmente costruito. Questa situazione si verifica quando la funzione di inclusione viene chiamata da un costruttore o distruttore di una classe che eredita la classe derivata denominata nell'avviso. Se la classe derivata denominata nell'avviso non viene mai derivata ulteriormente o la funzione di inclusione non viene chiamata durante la costruzione o la distruzione dell'oggetto, l'avviso può essere ignorato.
Esempio
L'esempio seguente genera l'errore C4437 e illustra il problema di generazione del codice che si verifica dal campo mancante 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;
}
Vedi anche
Operatore dynamic_cast
vtordisp
Avviso del compilatore (livello 1) C4436