Что выведет код 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 ошибок.

Термины по теме