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

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

Войти
Регистрация
Восстановить пароль
 
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
#1

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

04.01.2014, 01:06. Просмотров 558. Ответов 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: в чём смысл?
Посмотрите здесь:

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

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

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

В чём смысл return в main()? - C++
Есть ли смысл возвращать значение переменной в main()? Если да - зачем? #include&lt;iostream&gt; using namespace std; int main() ...

В чём смысл использования указателей на функции - C++
Собсно,я не могу понять,в чём смысл использования указателей на функции,ведь можно вызывать функции напрямую.Или же это сделано чисто для...

Как работает и в чём смысл побитового И в заданном фрагменте кода? - C++
Как то раз в просторах сети нашёл вот такую запись. fun ((x + y) &amp; 1); Где в fun равняется первый элемент void fun (const int) ...

Я новичок создаю программу подскажите в чём смысл ошибок???? что-то с библиотекой glut ? - C++
Создаю программу моделирование гравитации ) выдавало ошибку что нет библиотеки glut ) нашёл в инете скопировал вставил после этого выдаёт...

Static_cast - C++
Подскажи пожалуста return static_cast&lt;double&gt;(get_num())/get_den(); как это понимать, а то в книге написано, но не объяснено, а в...

static_cast - C++
В чем ошибка. ругается на &lt; и ( в строке newpound=static_cast&lt;int&gt;(newpound); #include &lt;iostream.h&gt; #include &lt;conio.h&gt; int...

static_cast - C++
Почему не работает static_cast&lt;float&gt;(n/m);? Как сделать чтобы он все же перевел это к типу float? #include &lt;iostream&gt; using...

static_cast, исключение - C++
Привет. dynamic_cast&lt;&gt; может выбросить исключение, при невозможности преобразования типа при работе с ссылками. старое приведение...

Использование static_cast - C++
Здравствуйте! Подскажите, почему такая конструкция не компилируется. int main() { int nWord = 4; char temp = static_cast&lt;...


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

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

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