Предупреждение компилятора (уровень 4) C4437
dynamic_cast из виртуальной базы "class1" в "class2" может завершиться ошибкой в некоторых контекстах компиляции с помощью /vd2 или определить "class2" с #pragma vtordisp(2) в действии
Это предупреждение отключено по умолчанию. Подробнее: Выключенные по умолчанию предупреждения компилятора .
Компилятор столкнулся с операцией dynamic_cast
со следующими характеристиками.
Приведение выполняется из указателя базового класса на указатель производного класса.
Производный класс практически наследует базовый класс.
Производный
vtordisp
класс не имеет поля для виртуальной базы.Приведение не найдено в конструкторе или деструкторе производного класса или некоторых классах, которые далее наследуются от производного класса (в противном случае будет выдано предупреждение компилятора C4436).
Предупреждение указывает, что dynamic_cast
может не выполняться правильно, если он работает на частично созданном объекте. Эта ситуация возникает, когда включающая функция вызывается из конструктора или деструктора класса, наследующего производный класс, который называется в предупреждении. Если производный класс, именованный в предупреждении, никогда не является последующим производным, или заключающая функция не вызывается во время построения или уничтожения объектов, предупреждение может быть проигнорировано.
Пример
Следующий пример создает C4437 и демонстрирует проблему создания кода, возникающую из отсутствующих 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;
}
См. также
Оператор dynamic_cast
vtordisp
Предупреждение компилятора (уровень 1) C4436