Объясните почему при вводе 0 и выбросе исключения Base, оно не отлавливается блоком Derived1?
int main()
{
int number = 0;
for (;;)
{
try
{
cin >> number;
cout << number << " ";
switch (number)
{
case 0:
throw Base();
case 1:
throw Derived1();
case 2:
throw Derived2();
}
}
catch (Derived1 /*exception*/)
{
cout << "Exception of derived class" << endl;
}
catch (Base /*exception*/)
{
cout << "Exception of Base class" << endl;
}
}
return 0;
}
Ответ
Потому что Base не является Derived, а вот Derived является Base
Вот если бы вы написали (кстати, перехватывайте исключения по ссылке, иначе столкнетесь со срезкой)
catch (Base& /*exception*/)
{
cout << "Exception of Base class" << endl;
}
catch (Derived1& /*exception*/)
{
cout << "Exception of derived class" << endl;
}
то тут и Base, и Derived ловились бы первым блоком - Base
Комментариев нет:
Отправить комментарий