Выбор ответа Senior Исключения обновлено
throw; против throw e;
Вопрос
Внутри catch (Base& e) (поймали объект типа Derived) написано throw e;. Что полетит дальше?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Копия типа Base: динамический тип потерян, а throw; сохранил бы его. throw e; создаёт новый объект исключения из выражения e, тип берётся статический: Base.
Варианты ответа
- Копия типа
Base: динамический тип потерян, аthrow;сохранил бы егоправильный ответ - Исходный объект
Derived:throw e;перебрасывает текущее исключение - Ничего не полетит: повторный бросок внутри
catchзапрещён - Копия типа
Derived: копирование идёт по динамическому типу объекта
Разбор
throw e; создаёт новый объект исключения из выражения e, тип берётся статический: Base. Внешний catch (Derived&) его уже не поймает. throw; без операнда перебрасывает текущий объект исключения как есть.
- Исходный объект летит только при
throw;. - Перебрасывать можно.
- Копирование при броске идёт по статическому типу, отсюда и срезка.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.