602_______________________________Часть IV. Новые возможности C++

Следующий пример, листинг 22.17, демонстрирует некоторые выводы из правил 1, 4 и 5.

h06021.jpg

// Необходимые заголовки #include <iostream.h>

class Firsti { };

class First2 { };

class Last : public Firsti, public First2'( };

Last MyLast;

void Funcl(int flag) t

cout « "B Funcl.\n";

if (flag)

throw MyLast;

}

void main() f

try {

Funcl(l);

) catch (Firstis) { . .

cout « "Перехвачена исключительная ситуация Firsti.\n";

} catch (First2&) {

cout « "Перехвачена исключительная ситуация First2.\n";

} catch (...) {

cout « " Перехвачена неопознанная исключительная ситуация.\п";

)

В этом фрагменте содержится иерархия множественного наследования: класс Last наследуется как от класса Firsti, так и от First2. Когда Fund () генерирует исключительную ситуацию MyLast, программа ищет подходящий обработчик в списке, расположенном в функции main(). Первым проверяется обработчик catch (Firstl&). Генерируемая исключительная ситуация имеет тип Last; очевидно, точного соответствия между обработчиком ,и исключительной ситуацией нет, однако, так как класс Last наследуется от класса Firsti, этот обработчик по правилам 4 и 5 считается приемлемым.

Предположим, что вы переупорядочите этот перечень таким образом, что обработчик First2s расположится перед обработчиком Firstl&, как показано ниже: