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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задание на двумерный массив с оформлением в виде функции http://www.cyberforum.ru/cpp-beginners/thread1019360.html
Среди столбцов заданной целочисленной матрицы, содержащей только такие элементы, которые по модулю не больше m, найти столбец с минимальным произведением элементов.
C++ char и char* разница Привет всем:) Изучаю С++ и вот застрял на задании где надо удалить символ из входного потока. В гугле нашел вот такое код( смотрите ниже ). Он работает удаляет нужный символ. Но я не могу понять чем отличается char от char*. Можно простое объяснение или простой пример программы, чтобы понять разницу. Заранее спасибо:) #include <iostream> using namespace std; char * del_char(const char... http://www.cyberforum.ru/cpp-beginners/thread1019350.html
C++ Найти сумму элементов массива, расположенных между первым и вторым отрицательными элементами
В одномерном массиве,состоящем из n вещественных элементов, вычислить : 1.Номер минимального элемента массива 2.Сумма элементов массива, расположенных между первым и вторым отрицательными элементами. Преобразив массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает единицу, а потом - все остальное.
C++ Пропозициональная формула
Написать программу для реализации следующего алгоритма определения является ли данная строка символов пропозициональной формулой или нет: шаг 1. Проверка скобочного итога формулы. шаг 2. Проверка того, что первый символ открывающаяся скобка, а последний- закрывающаяся. В случае выполнения условия, удалить внешние скобки. шаг 3. Если первый символ отрицание, то удалить его и повторить шаг 2....
C++ Выполнить сортировку массива с помощью стандартной функции быстрой сортировки qsort http://www.cyberforum.ru/cpp-beginners/thread1019297.html
2. Выполнить сортировку массива с помощью стандартной функции быстрой сортировки qsort, прототип которой находится в заголовочном файле сstdlib (написать для нее функцию сравнения, которая передается в качестве параметра, и заполнить таблицу строк). помогите написать программу с помощи с++
C++ Вывод содержимого файла Есть программа, вот код: #include <iostream> #include <fstream> using namespace std; struct Abon { char name; int god; char janr; подробнее

Показать сообщение отдельно
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 582

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

26.11.2013, 11:09. Просмотров 1020. Ответов 10
Метки (Все метки)

хочу разобраться с преобразованием указателей в 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;
пройдет успешно

ВЫВОД "скобочное преобразование указателей" является небезопасным преобразованием, так как позволяет выполнить преобразование соседних классов, но дает большую свободу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru