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

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

Восстановить пароль Регистрация
 
Jack Wade
61 / 34 / 6
Регистрация: 24.02.2013
Сообщений: 250
04.01.2014, 01:06     Dynamic_cast и static_cast: в чём смысл? #1
Здравствуйте!
Подскажите пожалуйста...
В теории, как я понял, 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))... Помогите пожалуйста...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 01:06     Dynamic_cast и static_cast: в чём смысл?
Посмотрите здесь:

Static_cast C++
Я новичок создаю программу подскажите в чём смысл ошибок???? что-то с библиотекой glut ? C++
C++ static_cast
C++ static_cast
Чем отличаются dynamic_cast и static_cast? C++
отличия dynamic_cast, static_cast и (object*) C++
C++ В чём смысл использования указателей на функции
C++ В чём смысл return в main()?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 01:13     Dynamic_cast и static_cast: в чём смысл? #2
Jack Wade, внизу страницы туча ссылок на "похожие темы". Расжевывалось уже неоднократно.
Yandex
Объявления
04.01.2014, 01:13     Dynamic_cast и static_cast: в чём смысл?
Ответ Создать тему
Опции темы

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