Существуют ли случаи, когда будет определено понижение действительной базы до производной?

В общем случае, это (очень заслуженное) неопределенное поведение для даункаста из (динамического)Base к одному из производных классовDerived

Очевидный UB
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 это случайный выбор для иллюстрации, это также интересно, если вы работаете с другими приведениями!

Ответы на вопрос(3)

Ваш ответ на вопрос