Здравствуйте!
Подскажите пожалуйста...
В теории, как я понял, 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))... Помогите пожалуйста...