воскресенье, 15 февраля 2009 г.

Ловим исключения

Вот еще интересный пример, который встретился также в тесте по С++
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".

Теперь чуть-чуть изменим код

} catch (BaseException e) {
И на печать будет выведено уже "Base". Рассчитано, конечно, на невнимательность. Я, когда проходил тест, больше задумывался, попадет ли DerivedException в catch с BaseException. Оказалось, что попадет. А на тонкость с "&" я бы внимание вообще не обратил, если бы (так уж вышло) мне не встретилось практически подряд два "одинаковых" вопроса.

2 комментария: