Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

dynamic_cast - C++

15.07.2011, 16:25. Просмотров 1730. Ответов 8
Метки нет (Все метки)

Уважаемые, подскажите теорию. Как устроен данный каст? Не нашел его определений. В студии он зашит в библиотеку, подсказок в хелпе про него нету. А задание - реализовать нечто подобное своими функциями. (текстов реализации задание НЕ надо) Насколько я понял из описания его работы - он проверяет является ли тип к которому приводим базовым для приводимого или нет, является ли наследования от базы не private или оно закрытое, на основании этого принимается решение - вернуть указатель или нул.

Непонятно следующее
как выудить инфо о том является ли один класс базовым для для другого, тип наследования.? Где хранится эта таблица с инфой о разнообразных виртуальных функциях и типе, или это разные места?

Единственное предположение - использовать typeid? что то не очень похоже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2011, 16:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос dynamic_cast (C++):

dynamic_cast - C++
Помогите разобраться с dynamic_cast, а точнее с вот этой записью void f() { A* pa = new A; B* pb = new B; void* pv =...

dynamic_cast - C++
#include <iostream> class B { public: virtual void foo(){std::cout<<"B";} private: int a; }; class D : public B { ...

dynamic_cast - C++
Подскажите пожалуйста, возникла проблема. Есть базовый клас CStep. И пока один наследник: class CStepMove : public CStep Ести вектор...

Dynamic_cast - C++
#include <iostream> #define STOP cin.get(); using std::cin; using std::cout; class A { public: // void foo()

dynamic_cast() шаблон - C++
Здорова! Пытаюсь свой шаблон функции создать dynamic_cast() это ptr_cast() но ничо не получается. Не могу никак сам шаблон написать ...

Dynamic_cast и полиморфизм - C++
Задача: В листинге 15.16 после каждого блока try находятся два блока catch, поэтому исключение nbad_index приводит к вызову метода...

8
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.07.2011, 16:35 #2
http://darkraha.com/rus/cpp/cpp29.php
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
15.07.2011, 16:37  [ТС] #3
oxotnik, да там про typeid и type_info. что динамик каст внутри себя их чтоли пользует?
если да, то совершенно непонятно почему Струструп разделил эти термины на отдельные статьи и настоятельно рекомендует пользоваться динамик_каст а не тайпид.
0
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.07.2011, 16:40 #4
Цитата Сообщение от AzaKendler Посмотреть сообщение
что динамик каст внутри себя их чтоли пользует?
хз... возможно
а неужели и правда в студии к сырцам не подобраться? для new помниться были сырцы (правда долго их искать было)
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 16:43 #5
Что-то сомневаюсь, что можно безопасно добраться до таблиц с информацией о типах. Т.е. я на 100% уверен, что без привязки к компилятору этого сделать нельзя, да и с привязкой скорее всего то же.
Т.е. получить доступ к таблицам виртуальных функций достаточно просто и, даже, модифицировать возможно, но это ничего тебе не даст. Тем более, подразумевается работа без использования стандартных механизмов (иначе я опять буду гундеть про тупых преподов).

Вариант самый простой:
В каждый дочерний объект добавить typedef имя_родителя inheritance; для получения типа родительского класса. Плюс, добавить метод Convert, который будет модифицировать указатель this (не reinterpret_cast, а сдвигать указатель соответствующим образом) и приводить его к inheritance (теперь уже reinterpret_cast'ом). Как сделать преобразование от базового к дочернему не скажу.) Нужно дополнительную инфу хранить.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
15.07.2011, 16:49  [ТС] #6
oxotnik, ну можа я слабо ищу. При пошаговом выполнении открывает окно для поиска файла rtti.cpp(я его искал на диске потом - нету), потом перебирает адреса в памяти в поиске инфы и...хлопс - выдает результат.

Добавлено через 4 минуты
Deviaphan, ну задание сделать шаблон. т.е. он должден будет принимать любые классы. а есть в них доп инфа или нет, уже не угадаешь. Интересный механизм про хранение инфы. Только не совсем въехал про - <сдвигать указатель this> это я так понял менять его адрес? пока он не станет равен адресу допинфы про родителя? двигать с шагом в размер самого себя?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 16:49 #7
Кстати, не обращайте внимания на постоянные замечания о том, что dynamic_cast замедляет программу. Кривое проектирование замедляет её гоооооораздо сильнее.
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
15.07.2011, 16:55  [ТС] #8
Deviaphan, да где то видел про типа замедление кто то как то писал. но Страуструп пишет что расходы ничтожны и ими можно пренебречь. А сам советует пользовать каст вместо ручных вариантов сравнений typeid

с другой стороны только сегодня по одной ссылке читал, что один разработчик игр писал собственную реализацию определений типов и приведений, и она оказалась быстрее стандартной он там тесты приводит на разных железяках. он в 1С работает. корсары они там пишут, пиратов кариббского моря
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 16:58 #9
Именно, что ничтожны.
Вручную можно только на равенство сравнивать. Т.е. базовый с дочерним не сравнишь. А учитывая множественное наследование, ручные способы почти всегда отпадают.
Только в очень специфичных ситуациях ручное сравнение понадобиться может и уж точно не для замены dynamic_cast.
0
15.07.2011, 16:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2011, 16:58
Привет! Вот еще темы с ответами:

Объясните dynamic_cast - C++
дали задание разобраться с dynamic_cast, что это такое и с чем его едят. Прочитал информацию про него, но в программе он не работает(или...

Работа с dynamic_cast - C++
Всем привет! Есть Абстрактный класс Transport. Есть три наследника: Plain, Train, Ship. Есть массив указателей на базовый класс который...

Использование dynamic_cast - C++
#include&lt;iostream&gt; #include&lt;locale.h&gt; using namespace std; class Base { public: virtual void f() {}; }; class Der :...

Dynamic_cast реализация - C++
Добрый вечер, есть застоявшаясь фраза: &quot;dynamic_cast&lt;Type*&gt;( pointer ) очень медленное, его лучше не использовать&quot; . Примерная...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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