Существуют ли случаи, когда будет определено понижение действительной базы до производной?
В общем случае, это (очень заслуженное) неопределенное поведение для даункаста из (динамического)Base
к одному из производных классовDerived
class Base
{
public:
virtual void foo()
{ /* does something */ }
int a;
}
class Derived : public Base
{
public:
virtual void foo()
{ /* does something different */ }
double b;
}
Base obj;
Derived derObj = *static_cast<Derived *>(&obj); // <- here come the demons
При текущем подходе к реализации компиляторов здесь, очевидно, будут, по крайней мере, проблемы несовместимых значений в Vtable и b, содержащих значения мусора. Таким образом, имеет смысл, что стандарт не определяет поведение downcast в этих условиях.
Не очень очевидный наивный случайИ все же мне было интересно узнатьбыли ли какие-то уступки этому правилу в конкретных случаях? Для примера:
class Base
{
public:
void foo()
{ /* does something */ }
int a = 1;
double b = 2.;
}
class DerivedForInt : public Base
{
int getVal()
{ return a }
}
Base obj;
DerivedForInt derObj = *static_cast<DerivedForInt *>(&obj); // <- still an UB ?
Здесь мы можем легко представить, что компилятор делает правильные вещи.Но со стандартной точки зрения, это все еще не определено?
Редактировать :static_cast это случайный выбор для иллюстрации, это также интересно, если вы работаете с другими приведениями!