Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
1

Dynamic_cast и static_cast: в чём смысл?

04.01.2014, 01:06. Показов 1698. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста...
В теории, как я понял, dynamic_cast является лишь приравниванием ссылки на 1 класс(допустим, класс one у нас-родитель, а класс two-наследник класса one), но с той лишь разницей, что выполняется так же и проверка на возможность приравнивания ссылки на класс one ссылке на класс two, и наоборот.
Ну, как я смотрел примеры, и, вроде бы всё ничего(на методы, можете не смотреть, это просто для того, чтобы класс был "полиморфным", на деле же, эти функции не используются и не планировались использоваться):
Кликните здесь для просмотра всего текста

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h"
#include <typeinfo>
#include <iostream>
#include <locale.h>
#include <Windows.h>
 
class one
{
    protected:         int  data;
    public:    virtual void enter_data (int new_data) { this->data=new_data; };
    public:                 one        (void)         { this->data=0;        };
};
 
class two : public one
{
    protected: float fdata;
    public: virtual void enter_data (float new_data) { this->fdata=new_data; };
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    bool* _kol_error=new bool(false);
    setlocale(LC_ALL,"Russian");
    one* pointer_1=new one();
    two* pointer_2=new two();
    std::cout<<"class one              <- класс родитель"<<std::endl;
    std::cout<<"class two : public one <- дочерен классу one"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"one* pointer_1 = new one()"<<std::endl;
    std::cout<<"two* pointer_2 = new two()"<<std::endl;
    std::cout<<std::endl;
    //Действие 1
    std::cout<<"dynamic_cast<one&>(*pointer_2)"<<std::endl;
    //Сравниваем ссылку на класс 2 с классом 1, дабы проверить их связь и есть ли она вообще
    std::cout<<"Найденные ошибки:"<<std::endl;
    try                                { dynamic_cast<one&>(*pointer_2); }
    catch (const std::bad_cast& error) { std::cerr<<error.what()<<std::endl; std::cerr<<"Выбран не верный класс, либо связь между классами отвутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    (*_kol_error)=false;
    std::cout<<std::endl;
    //Действие 2
    std::cout<<"dynamic_cast<two&>(*pointer_2)"<<std::endl;
    //Сравниваем ссылку на класс 1 с классом 2, дабы проверить их связь и есть ли она вообще
    std::cout<<"Найденные ошибки:"<<std::endl;
    try                                { dynamic_cast<two&>(*pointer_1); }
    catch (const std::bad_cast& error) { std::cerr<<error.what()<<std::endl; std::cerr<<"Выбран не верный класс, либо связь между классами отвутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    _gettch();
    delete pointer_1;
    delete pointer_2;
        delete _kol_error;
    system("cls");
        return 0;
}

Так вот, у меня другой вопрос:
Когда я пытаюсь сделать всё тоже самое с static_cast, появляются следующие ошибки:
1 - в посылаемом type-id(static_cast<type-id>(expression)) мне надо, когда я пытаюсь выполнить через try сравнение класса two с классом one, эмперсан(т.е. адрес на класс one(<one&>), хотя, казалось бы, адрес здесь и не нужен, т.к. мы работаем с статикой... или, я чего то не понял...
2 - даже если и добавить one&, в случае с static_cast, ошибок не будет, а в dynamic_cast будут...
Если не сложно-расскажите пожалуйста, в чём роль static_cast и dynamic_cast, а так же, из-за чего, при static_cast<one>(class_2)-всё нормально, а при static_cast<two>(class_1) надо добавлять эмперсант?
Весь код программы:
Кликните здесь для просмотра всего текста

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "stdafx.h"
#include <typeinfo>
#include <iostream>
#include <locale.h>
#include <Windows.h>
 
class one
{
    protected:         int  data;
    public:    virtual void enter_data (int new_data) { this->data=new_data; };
    public:                 one        (void)         { this->data=0;        };
};
 
class two : public one
{
    protected: float fdata;
    public: virtual void enter_data (float new_data) { this->fdata=new_data; };
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    bool* _kol_error=new bool(false);
    setlocale(LC_ALL,"Russian");
    one* pointer_1=new one();
    two* pointer_2=new two();
    std::cout<<"class one              <- класс родитель"<<std::endl;
    std::cout<<"class two : public one <- дочерен классу one"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"one* pointer_1 = new one()"<<std::endl;
    std::cout<<"two* pointer_2 = new two()"<<std::endl;
    std::cout<<std::endl;
    //Действие 1
    std::cout<<"dynamic_cast<one&>(*pointer_2)"<<std::endl;
    //Сравниваем ссылку на класс 2 с классом 1, дабы проверить их связь и есть ли она вообще
    std::cout<<"Найденные ошибки:"<<std::endl;
    try                                { dynamic_cast<one&>(*pointer_2); }
    catch (const std::bad_cast& error) { std::cerr<<error.what()<<std::endl; std::cerr<<"Выбран не верный класс, либо связь между классами отвутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    (*_kol_error)=false;
    std::cout<<std::endl;
    //Действие 2
    std::cout<<"dynamic_cast<two&>(*pointer_2)"<<std::endl;
    //Сравниваем ссылку на класс 1 с классом 2, дабы проверить их связь и есть ли она вообще
    std::cout<<"Найденные ошибки:"<<std::endl;
    try                                { dynamic_cast<two&>(*pointer_1); }
    catch (const std::bad_cast& error) { std::cerr<<error.what()<<std::endl; std::cerr<<"Выбран не верный класс, либо связь между классами отвутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    _gettch();
    delete pointer_1;
    delete pointer_2;
    system("cls");
    //Теперь, работаем с static_cast:
    one class_1;
    two class_2;
    (*_kol_error)=false;
    std::cout<<"class one              <- класс родитель"<<std::endl;
    std::cout<<"class two : public one <- дочерен классу one"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"one class_1"<<std::endl;
    std::cout<<"two class_2"<<std::endl;
    std::cout<<std::endl;
    //Действие 1_2
    std::cout<<"static_cast<one?>(class_2)"<<std::endl;
    try                               { static_cast<one>(class_2); }
    catch (const std::bad_cast error) { std::cerr<<error.what()<<std::endl; std::cout<<"Выбран не верный класс, либо связь между классами отсутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    (*_kol_error)=false;
    std::cout<<std::endl;
    //Действие 2_2
    std::cout<<"static_cast<two&>(class_1)"<<std::endl;
    try                               { static_cast<two&>(class_1); }
    catch (const std::bad_cast error) { std::cerr<<error.what()<<std::endl; std::cout<<"Выбран не верный класс, либо связь между классами отсутствует!"<<std::endl; (*_kol_error)=true; }
    if ((*_kol_error)==false) std::cout<<"Ошибок в связи классов нету!"<<std::endl;
    (*_kol_error)=false;
    std::cout<<std::endl;
    _gettch();
    delete _kol_error;
    return 0;
}
P.S. Ну, что я понял, так это то, что dynamic_cast работает только с указателями, а static_cast работает только с "прямыми" переменными... Ну, это то и понятно по названию. И что dynamic_cast выполняет проверку, а static_cast нет, но в чём суть и роль этой проверки-не понял(вроде бы как, проверка на возможность преобразования, дабы не было ошибок, что мы пытаемся присвоить один тип данных другому, которые между друг другом не совместимы(для примера, int и float))... Помогите пожалуйста...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2014, 01:06
Ответы с готовыми решениями:

Чем отличаются dynamic_cast и static_cast?
если можно пример напишите

Когда использовать static_cast и dynamic_cast?
Всем добрый день! Такой вопрос - назревает у меня собеседование, и есть ряд вопросов, которые...

Отличия dynamic_cast, static_cast и (object*)
хочу разобраться с преобразованием указателей в c++ Итак имеем указатель на какойто класс ...

Теряются ли данные при использовании static_cast и dynamic_cast?
Здравствуйте! Подскажите пожалуйста, при преобразовании данными методами производного класса к...

1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 01:13 2
Jack Wade, внизу страницы туча ссылок на "похожие темы". Расжевывалось уже неоднократно.
0
04.01.2014, 01:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2014, 01:13
Помогаю со студенческими работами здесь

Примеры о dynamic_cast<> и static_cast <>
Привет. Можете поширее обяснить что такое dynamic_cast&lt;&gt; и static_cast &lt;&gt; и показать живой...

Чем отличается static_cast от приведения в стиле Си?
Привет всем! чем отличаются явное приведения типа long tmp = static_cast&lt;long&gt;(45.6); от long...

В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast?
В чем разница между Си'шным приведением типа: ... int x{5}; ifs.write( (char*)&amp;x, sizeof(int)...

В чем смысл?
Привет всем! Не могу понять - в чем смысл магазинов электронных книг? Можно ведь скачать абсолютно...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru