Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

06.07.2012, 14:41. Просмотров 717. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 14:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полиморфный наследник от exception (C++):

Абстрактный класс CGraphicsObject, его наследник - базовый класс CPoint, и класс - наследник от CPoint - C++
Всем доброй ночи! Очень нужна помощь и по мере возможности разъяснения на темы: абстрактный класс в задании(что он из себя представляет и...

Полиморфный конструктор [C++] - C++
Добрый день форумчане! Помогите разобраться, что такое полиморфный конструктор. На рсдн нашел про класс(в себе должен содержать виртуальную...

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process - C++
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с этой ошибкой? Только плиз на примере и доступными словами, т....

Полиморфный multimap в Windows Forms - C++
Сказали сделать вот такую лабу. Контейнер должен работать с числами, строками и структурами(это ключи). #include &quot;map&quot; #include...

Создать полиморфный объект и продемонстрировать работу функций - C++
Есть классы: class A { public: virtual void f() {} }; class B : public A { public: void f() {

На базе набора функций создать полиморфный класс - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; #include &lt;iomanip&gt; using namespace std; bool done = 0; ...

7
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2012, 15:10 #2
Цитата Сообщение от Yacudzer Посмотреть сообщение
catch (exception &e)
C++
1
catch(const myex& e)
0
Yacudzer
4 / 4 / 2
Регистрация: 06.07.2012
Сообщений: 125
06.07.2012, 15:17  [ТС] #3
Нет, не пойдет. В общем случае я не знаю кто из наследников кинул исключение. Для чего же полиморфизм то?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2012, 15:20 #4
Т.е. вы хотите, чтобы родитель вызывал метод наследника, о которых он, к слову говоря, ничего не знает?
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.07.2012, 15:41 #5
Цитата Сообщение от Yacudzer Посмотреть сообщение
Для чего же полиморфизм то?
это у вас нужно спросить
Цитата Сообщение от Yacudzer Посмотреть сообщение
C++
1
2
3
4
virtual void what()
* * {
* * * * printf("%d : %s\n",err_code,err_txt);
* * }
std::exception внимательно смотрим на сигнатуру what()
0
Yacudzer
4 / 4 / 2
Регистрация: 06.07.2012
Сообщений: 125
06.07.2012, 17:09  [ТС] #6
Jupiter, я пока еще только учусь Кажется понятно, что объявления должны быть одинаковые. Однако, что же происходило в моем случае? Почему не было ошибки при компиляции? И зачем throw() в конце объявления метода?
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.07.2012, 18:04 #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;
}
1
rangerx
1940 / 1549 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
06.07.2012, 21:03 #8
Цитата Сообщение от Yacudzer Посмотреть сообщение
И зачем throw() в конце объявления метода?
В двух словах: внутри скобок обычно указываются типы исключений, которые могут сгенерироваться при вызове функции. Т.е. те типы исключений, которые в случае их возникновения необходимо обработать за пределами функции(функция за обработку этих исключений не отвечает). И наоборот, все те типы исключений, которые в списке не указаны должны обрабатываться непосредственно внутри данной функции, в противном случае программа завершится аварийно. Если список пуст, соответсвенно функция должна самостоятельно следить за обработкой всех видов исключений, которые так или иначе могут возникнуть при её вызове.
1
06.07.2012, 21:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2012, 21:03
Привет! Вот еще темы с ответами:

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location" - C++
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку? Вот #include &lt;iostream&gt; #include &quot;kmath.h&quot; ...

класс наследник - C++
Добрый день! Интересует вопрос отношения между parent-классом и child'ом. Допустим в protected parent класса описаны какие-то методы, а...

Наследник не унаследовал поле ? - C++
Есть следующий код : class Parent { public: Parent():str(&quot;Parent&quot;) {} ~Parent(){} string name; };

Перегрузка операций. Предок/наследник. - C++
Доброго времени суток. Есть проблема в коде, в общем не запускается у меня программа, просьба посмотреть и по возможности исправить (код...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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