Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
il dynamic_cast virtuale dalla base “classe1" a “classe2" in costruttore o un distruttore non funzioni correttamente con oggetto parzialmente costruito viene compilato con /vd2 che definisce “classe2" con il vtordisp #pragma (2) in effetti
Il compilatore ha rilevato un'operazione dynamic_cast con le seguenti caratteristiche.
Il cast ha origine da un puntatore della classe di base a un puntatore della classe derivata.
La classe derivata virtualmente eredita la classe base.
La classe derivata non ha un campo vtordisp per la base virtuale.
Il cast viene trovato in un costruttore o un distruttore della classe derivata, o in una classe che ulteriormente eredita dalla classe derivata.
L'avviso indica che dynamic_cast non eseguire correttamente, si utilizza un oggetto parzialmente costruito.Ciò si verifica se il costruttore o un distruttore derivati utilizza un sotto-oggetto di un ulteriore oggetto derivato da.Se la classe derivata denominata nell'avviso non viene mai più derivato, l'avviso può essere ignorato.
Esempio
Nell'esempio seguente viene generato C4436 e viene illustrato il problema della generazione di codice che risulta mancante dal campo 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;
}