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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Yacudzer
3 / 3 / 2
Регистрация: 06.07.2012
Сообщений: 116
#1

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

06.07.2012, 14:41. Просмотров 668. Ответов 7
Метки нет (Все метки)

Добрый день.
Подскажите как корректно перехватить наследника от 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2537 / 1302 / 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
Сообщений: 116
06.07.2012, 15:17  [ТС]     Полиморфный наследник от exception #3
Нет, не пойдет. В общем случае я не знаю кто из наследников кинул исключение. Для чего же полиморфизм то?
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2012, 15:20     Полиморфный наследник от exception #4
Т.е. вы хотите, чтобы родитель вызывал метод наследника, о которых он, к слову говоря, ничего не знает?
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 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
Сообщений: 116
06.07.2012, 17:09  [ТС]     Полиморфный наследник от exception #6
Jupiter, я пока еще только учусь Кажется понятно, что объявления должны быть одинаковые. Однако, что же происходило в моем случае? Почему не было ошибки при компиляции? И зачем throw() в конце объявления метода?
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 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
Еще ссылки по теме:

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process C++
На базе набора функций создать полиморфный класс C++
Наследник не унаследовал поле ? C++
C++ Создать полиморфный объект и продемонстрировать работу функций
C++ Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru