struct BaseException {
virtual void Output() {
std::cout << "Base" << std::endl; }
};
struct DerivedException : public BaseException{
virtual void Output() {
std::cout << "Derived" << std::endl; }
};
void Test() {
try {
throw DerivedException();
} catch (BaseException& e) {
e.Output();
} catch (DerivedException& e) {
e.Output();
} catch (...) {
std::cout << "Unhandled exception" << std::endl;
}
};
Вопрос стандартный: какой catch сработает и что будет выведено на печать? Ответ: срабатывает первый catch, на печать будет выведено "Derived".
Теперь чуть-чуть изменим код
И на печать будет выведено уже "Base". Рассчитано, конечно, на невнимательность. Я, когда проходил тест, больше задумывался, попадет ли DerivedException в catch с BaseException. Оказалось, что попадет. А на тонкость с "&" я бы внимание вообще не обратил, если бы (так уж вышло) мне не встретилось практически подряд два "одинаковых" вопроса.
} catch (BaseException e) {
Тест не с odesk случайно? А про исключение по ссылке есть в Страуструпе.
ОтветитьУдалитьАга, тест с odesk был.
ОтветитьУдалить