Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныЗаметкиВопрос-ответКнигорецензииСправочная

20. Срезка и исключения

Как вы считаете, позволит ли компилятор срезку во время перехвата исключения? Что будет на консоли?
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

class base
{

};

class derived : public base
{

};

int main()
{
    try
    {
        throw derived();
    }
    catch(base)
    {
        std::cout << "base" << std::endl;
    }
    catch(derived)
    {
        std::cout << "derived" << std::endl;
    }

    return 0;
}
Компилировать в Comeau
Правильный ответ.
К сожалению, позволит. В этот раз на экране вы увидите:

Base

Поиск подходящего catch происходит сверху вниз. Подходящим catch считается первый catch, для которого существует неявное преобразование (за некоторым исключением). Это одна из причин, по которой рекомендуется перехватывать исключения по ссылке. И по этой причине блоки catch обычно располагаются последовательно снизу вверх по иерархии классов.

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

электроинструменты магазины спб статьи электроинструмент. купить фрезерные станки вопросы