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

отличия dynamic_cast, static_cast и (object*) - C++

Восстановить пароль Регистрация
 
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
26.11.2013, 11:09     отличия dynamic_cast, static_cast и (object*) #1
хочу разобраться с преобразованием указателей в c++

Итак имеем указатель на какойто класс

myclass *mc = new myclass();
myclass2 *mc2 = new myclass2();
myclass3 *mc3 = new myclass3();

1) dynamic_cast

- в случае если класс myclass2 является наследником myclass то в результате преобразование

C++
1
myclass *mc = dynamic_cast<myclass*>(mc2);
пройдет успешно

в обратную сторону преобразование не будет упешным

- добавим класс myclass3 который является еще одним наследником myclass НО НЕ наследником myclass2

тогда

C++
1
myclass3 *mc3 =  dynamic_cast<myclass3*>(mc2);
тоже не будет успешным

ВЫВОД dynamic_cast по сути "безопасное преобразование", которые в некоторых случаях не дает выполнить небезопасное привидение типов

2) static_cast

- myclass2->myclass

C++
1
myclass *mc = static_cast<myclass*>(mc2);
пройдет успешно

- обратную сторону myclass->myclass2

C++
1
myclass2 *mc = static_cast<myclass2*>(mc);
пройдет успешно

- между соседними классами myclass2->myclass3

C++
1
myclass2 *mc = static_cast<myclass2*>(mc3);
ошибка компиляции
=> static_cast в отличие от dynamic_cast срабатывает непосредвенно перед компиляцией


ВЫВОД static_cast по сути "статическое преобразование", в отличе от dynamic_cast работает перед компиляцией приложения и поэтому пропускает обратное преобразования классов типов родитель->наследник

таким образом можно через static_cast делать "виртуальные классы" которые могут дополнять класс родитель и получать доступ к него protected свойствам, без создания экземпляра наследника

3) скобочное преобразование указателей

возьмем сразу 3 случай, так как он не работает ни с static_cast ни с dynamic_cast

C++
1
myclass2 *mc = (myclass2*) mc3;
пройдет успешно

ВЫВОД "скобочное преобразование указателей" является небезопасным преобразованием, так как позволяет выполнить преобразование соседних классов, но дает большую свободу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2013, 11:09     отличия dynamic_cast, static_cast и (object*)
Посмотрите здесь:

Static_cast C++
C++ static_cast
C++ static_cast, исключение
C++ static_cast
C++ Использование static_cast
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
26.11.2013, 11:14     отличия dynamic_cast, static_cast и (object*) #2
знака вопроса не стоит - в чем вопрос?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.11.2013, 11:15     отличия dynamic_cast, static_cast и (object*) #3
noname_club, Читайте стандарт. Параграф 5.2.3 Explicit type conversion (functional notation).
На тему static_cast - преобразование происходит на этапе компиляции, а не перед ним.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
26.11.2013, 11:17  [ТС]     отличия dynamic_cast, static_cast и (object*) #4
знака вопроса не стоит - в чем вопрос?
если я не прав тогда нужно написать в чем именно. в этом и вопрос.

Добавлено через 1 минуту
На тему static_cast - преобразование происходит на этапе компиляции, а не перед ним.
не суть, главное, что не во время работы программы, в отличе от dynamic_cast
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
26.11.2013, 11:19     отличия dynamic_cast, static_cast и (object*) #5
noname_club, что ж так вероломно забыты reiterpret_cast, да const_cast ?))

Добавлено через 55 секунд
про приведение в стиле Си - забыть и не использовать никогда

Добавлено через 41 секунду
эта якобы свобода может дать непредсказуемые результаты
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
26.11.2013, 11:20  [ТС]     отличия dynamic_cast, static_cast и (object*) #6
noname_club, что ж так вероломно забыты reiterpret_cast, да const_cast ?))
О действительно, они мне не известны, а стоит ли о них знать, применительно к классовым указателям?

Добавлено через 1 минуту
про приведение в стиле Си - забыть и не использовать никогда
которое работает, а раз работает значит должно быть на наготове, когда cast сливается и не может преобразовать указатель
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.11.2013, 11:24     отличия dynamic_cast, static_cast и (object*) #7
noname_club, Приведение вида (type) не является сишным в данном контексте. Оно преобразуется
либо в const_cast, либо в static_cast, либо в static_cast + const_cast, либо в reinterpret_cast, либо в reinterpret_cast + const_cast.
В случае
C++
1
myclass2 *mc = (myclass2*) mc3;
используется reinterpret_cast.
An object pointer can be explicitly converted to an object pointer of a different type.70 When a prvalue
v of type “pointer to T1” is converted to the type “pointer to cv T2”, the result is static_cast<cv
T2*>(static_cast<cv void*>(v)) if both T1 and T2 are standard-layout types (3.9) and the alignment
requirements of T2 are no stricter than those of T1, or if either type is void. Converting a prvalue of type
“pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment
requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer
value. The result of any other such pointer conversion is unspecified.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
26.11.2013, 11:29  [ТС]     отличия dynamic_cast, static_cast и (object*) #8
Цитата Сообщение от ForEveR Посмотреть сообщение
noname_club, Приведение вида (type) не является сишным в данном контексте. Оно преобразуется
либо в const_cast, либо в static_cast, либо в static_cast + const_cast, либо в reinterpret_cast, либо в reinterpret_cast + const_cast.
В случае
C++
1
myclass2 *mc = (myclass2*) mc3;
используется reinterpret_cast.
раз такая неопределенность при преобразовании, то не проще ли вообще не учитывать какой cast будет использован в случае myclass3->myclass2, а просто написать через скобки?

применительно к кроссплатформам например?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.11.2013, 11:32     отличия dynamic_cast, static_cast и (object*) #9
noname_club, И что получить? В данном случае, если базовый класс у myclass3 или myclass2 или сами они не является standard-layout - мы получим что-то непонятное.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
26.11.2013, 11:38  [ТС]     отличия dynamic_cast, static_cast и (object*) #10
noname_club, И что получить? В данном случае, если базовый класс у myclass3 или myclass2 или сами они не является standard-layout - мы получим что-то непонятное.
нет, если имеем дело с виртуальными классами

например есть класс который входит в библиотеку и ее менять нельзя

Но требуется расширить ее функционал, тогда создаем класс насленик, но без явного конструктора

Который при создании экзепляра будет создавать экзепляр myclass1 и в тоже время работать как myclass2

в терминологии ObjectiveC это называют классы-категории
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 11:49     отличия dynamic_cast, static_cast и (object*)
Еще ссылки по теме:

Чем отличаются dynamic_cast и static_cast? C++
Dynamic_cast и static_cast: в чём смысл? C++
C++ Оператор static_cast

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.11.2013, 11:49     отличия dynamic_cast, static_cast и (object*) #11
Ссылочку в "похожих темах" не забудьте посмотреть.
Чем отличаются dynamic_cast и static_cast?
Yandex
Объявления
26.11.2013, 11:49     отличия dynamic_cast, static_cast и (object*)
Ответ Создать тему
Опции темы

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