Что выведет код Senior Исключения обновлено
Что выведет: срезка и переброс
Вопрос
Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.
#include <exception>
#include <iostream>
struct Base : std::exception {
const char* what() const noexcept override { return "base"; }
};
struct Derived : Base {
const char* what() const noexcept override { return "derived"; }
};
int main() {
try { throw Derived(); } catch (const Base& b) { std::cout << b.what() << '\n'; }
try {
try { throw Derived(); } catch (const Base&) { throw; }
} catch (const Derived& d) {
std::cout << "rethrow " << d.what() << '\n';
}
try {
try { throw Derived(); } catch (const Base& b) { throw b; }
} catch (const Derived&) {
std::cout << "D\n";
} catch (const Base&) {
std::cout << "B\n";
}
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: derived, rethrow derived, B. Ловля по ссылке сохраняет настоящий тип: виртуальный what() вернёт derived. throw; перебрасывает исходный объект Derived, его ловит обработчик для Derived. throw b; бросает новую копию статического типа Base, поэтому срабатывает catch…
Что выведет
derived
rethrow derived
B
Разбор
Ловля по ссылке сохраняет настоящий тип: виртуальный what() вернёт derived. throw; перебрасывает исходный объект Derived, его ловит обработчик для Derived. throw b; бросает новую копию статического типа Base, поэтому срабатывает catch (const Base&).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.