604 Часть IV. Новые возможности С+-.

Исключительную ситуацию, которую генерирует эта программа — указатель на Derived — может быть перехвачена любым из четырех обработчиков, поскольку указатель на Derived можно привести к типу указателя на Base или к типу указателя на void. Заметьте, что к типу void* можно привести любой указатель, поэтому третий обработчик перехватывает любые исключительные ситуации типа указателя.

Что реально генерируется?

В этой главе неоднократно отмечалось, что хотя в большинстве примеров фигурировали достаточно простые — целочисленные или строковые — исключительные ситуации, в действительности они могут иметь любой тип. Первой естественной реакцией на это мог бы быть вопрос: "Почему?"

На этот вопрос уместно ответить вопросом: "А почему нет?" Ясно, что объекты C++ предоставляют намного более богатую палитру 4'ункциональных возможностей, чем, например, простой целочисленный тип. Классы могут предоставить программам широкий спектр функций обработки ошибок, в то время как простые типы — целое число или строка — могут только сообщить о наступлении нештатного события или весьма скупо его описать. Кроме этого, организация обработки исключительных ситуаций в иерархии классов позволяет программам обрабатывать ошибки на различных уровнях детализации. Возьмем, например, простую иерархию кпассов исключительных ситуаций, показанную на рис. 22.1.

h06041.jpg

Рис. 22.1

Пример иерархии классов исключительных ситуаций