Форум программистов, компьютерный форум CyberForum.ru

Полиморфный наследник от exception - C++

Восстановить пароль Регистрация
 
Yacudzer
3 / 3 / 2
Регистрация: 06.07.2012
Сообщений: 107
06.07.2012, 14:41     Полиморфный наследник от exception #1
Добрый день.
Подскажите как корректно перехватить наследника от exception??
В приведенном ниже коде виртуальный переопределенный метод what не вызывается. Как сделать так что бы вызывался?
C++
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
29
30
31
32
33
#include <iostream>
 
using namespace std;
 
class myex : public exception
{
protected:
    char err_txt[200];
    int err_code;
public:
    myex(int a,const char*b)
    {
        strcpy_s(err_txt,b);
        err_code=a;
    }
    virtual void what()
    {
        printf("%d : %s\n",err_code,err_txt);
    }
};
 
int main (void) {
    setlocale(LC_ALL,"RUSSIAN");
    try
    {
        throw myex(1,"aa");
    } catch (exception &e)
    {
        e.what();
        return 1;
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 14:41     Полиморфный наследник от exception
Посмотрите здесь:

Перегрузка операций. Предок/наследник. C++
C++ Полиморфный конструктор [C++]
C++ наследник шаблонного класса
C++ Написать класс и его наследник
Наследник класса, переопределение функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2012, 15:10     Полиморфный наследник от exception #2
Цитата Сообщение от Yacudzer Посмотреть сообщение
catch (exception &e)
C++
1
catch(const myex& e)
Yacudzer
3 / 3 / 2
Регистрация: 06.07.2012
Сообщений: 107
06.07.2012, 15:17  [ТС]     Полиморфный наследник от exception #3
Нет, не пойдет. В общем случае я не знаю кто из наследников кинул исключение. Для чего же полиморфизм то?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2012, 15:20     Полиморфный наследник от exception #4
Т.е. вы хотите, чтобы родитель вызывал метод наследника, о которых он, к слову говоря, ничего не знает?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.07.2012, 15:41     Полиморфный наследник от exception #5
Цитата Сообщение от Yacudzer Посмотреть сообщение
Для чего же полиморфизм то?
это у вас нужно спросить
Цитата Сообщение от Yacudzer Посмотреть сообщение
C++
1
2
3
4
virtual void what()
* * {
* * * * printf("%d : %s\n",err_code,err_txt);
* * }
std::exception внимательно смотрим на сигнатуру what()
Yacudzer
3 / 3 / 2
Регистрация: 06.07.2012
Сообщений: 107
06.07.2012, 17:09  [ТС]     Полиморфный наследник от exception #6
Jupiter, я пока еще только учусь Кажется понятно, что объявления должны быть одинаковые. Однако, что же происходило в моем случае? Почему не было ошибки при компиляции? И зачем throw() в конце объявления метода?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.07.2012, 18:04     Полиморфный наследник от exception #7
Цитата Сообщение от Yacudzer Посмотреть сообщение
Однако, что же происходило в моем случае? Почему не было ошибки при компиляции?
потому что ошибки нет, вы просто в наследнике создали новый метод
C++
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
29
30
31
32
33
34
35
36
37
38
#include <exception>
#include <iostream>
#include <cstring>
 
class myex : public std::exception
{
protected:
    char err_txt[200];
    int err_code;
public:
    myex(int a, const char*b)
    {
        std::strncpy(err_txt, b, 199);
        err_txt[199] = 0;
        err_code = a;
    }
    
    const char* what() const throw() 
    {
       static char buf[220]; 
       std::sprintf(buf, "%d : %s\n", err_code, err_txt);
       return buf; 
    }
};
 
int main() 
{
    try
    {
       throw myex(1,"aa");
    } 
    catch (std::exception const& e)
    {
        std::cout << e.what();
        return 1;
    }
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2012, 21:03     Полиморфный наследник от exception
Еще ссылки по теме:

C++ класс наследник
Полиморфный multimap в Windows Forms C++
First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.07.2012, 21:03     Полиморфный наследник от exception #8
Цитата Сообщение от Yacudzer Посмотреть сообщение
И зачем throw() в конце объявления метода?
В двух словах: внутри скобок обычно указываются типы исключений, которые могут сгенерироваться при вызове функции. Т.е. те типы исключений, которые в случае их возникновения необходимо обработать за пределами функции(функция за обработку этих исключений не отвечает). И наоборот, все те типы исключений, которые в списке не указаны должны обрабатываться непосредственно внутри данной функции, в противном случае программа завершится аварийно. Если список пуст, соответсвенно функция должна самостоятельно следить за обработкой всех видов исключений, которые так или иначе могут возникнуть при её вызове.
Yandex
Объявления
06.07.2012, 21:03     Полиморфный наследник от exception
Ответ Создать тему
Опции темы

Текущее время: 02:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru