Предположим, что у меня есть тип A и производный тип B. Когда я выполняю динамическое преобразование из A * в B *, какие проверки среды выполнения выполняются? Как он узнает, что актерский состав является законным?
Я предполагаю, что в .Net можно использовать прикрепленные метаданные в заголовке объекта, но что происходит на C++?Как работают динамические ролики?
ответ
Точный алгоритм является компилятором-specfic. Вот как это работает в соответствии со стандартом Itanium C++ ABI (2.9.7) (написано после и после него GCC).
Указатель на базовый класс является указателем на середину тела «большого» класса. Тело «большого» класса собрано таким образом, что любой базовый класс, на который указывает ваш указатель, вы можете равномерно получить доступ к RTTI для этого «большого» класса, который ваш «базовый» класс фактически равен. Этот RTTI представляет собой особую структуру, которая относится к «большой» информации о классе: о том, какой тип она имеет, какие базы она имеет и в каких смещениях они есть.
Фактически, это «метаданные» класса, но в более «двоичном» стиле.
V instance;
Base *v = &instance;
dynamic_cast<T>(v);
Dynamic литых используют тот факт, что, когда вы пишете dynamic_cast<T>(v)
, компилятор может сразу определить метаданные для «большого» класса об - т.е. V
! Когда вы напишите, вы думаете, что T
является более производным, чем Base
, поэтому компилятор будет нелегко делать бросок с базой. Но компилятор может сразу (во время выполнения) определяет наиболее deirved type-- V
-й он имеет только то, чтобы пересечь наследования граф, содержащиеся в метаданных, чтобы проверить, может ли он к V
обратному приведению T
. Если это возможно, он просто проверяет смещение. Если он не может или является однозначным, возвращается NULL
.
Динамическое литье выполняет проверку времени выполнения, является ли это действительным и выполнимым литье; он вернет NULL, когда невозможно выполнить бросок.
Dynamic литого процесс состоит из двух этапов:
Учитывая виртуальные таблицы указателя на объект, использовать смещение, чтобы восстановить указатель на полный класс. (После этого будут сделаны все настройки из этого указателя.) Это эквивалент нисходящего потока для полного класса.
Поиск типа_info полного класса для нужного вам типа - другими словами, перейдите по списку всех баз. Если мы найдем один, используйте смещение, чтобы снова отрегулировать указатель. Если поиск на шаге 2 завершится неудачно, верните NULL.
Отремонтируйте свою любимую книгу на RTTI.
- 1. Как работают динамические шаблоны php?
- 2. динамические подсказки не работают
- 3. Динамические структуры не работают
- 4. Highcharts динамические категории не работают
- 5. загрузочные динамические таблетки не работают
- 6. Динамические ячейки выбора работают наполовину
- 7. Динамические изображения Vue.js не работают
- 8. Ионные динамические вкладки не работают
- 9. Вложенные ролики Python
- 10. Flash-ролики на Sharepoint
- 11. Ролики для подтипов
- 12. флеш-ролики с javascript
- 13. Вращающиеся ролики PHP
- 14. Событие нажатия на динамические элементы не работают
- 15. Rails Slick Carousel Динамические данные не работают
- 16. Огурец: рельсы динамические не работают в paths.rb
- 17. Динамические php и jQuery не работают
- 18. Динамические строки с выпадающими ячейками не работают
- 19. JQuery двойные динамические флажки не работают
- 20. IIS Динамические сжатия не работают Виртуальные поддомены
- 21. Динамические данные ASP.NET работают только для чтения?
- 22. jQuery Динамические вызовы функций не работают
- 23. Ролики Rest-Writer и CPF
- 24. Как заблокировать рекламные ролики видеороликов ActionScript 3.0?
- 25. Flash-ролики воспроизводятся как в замедленном темпе
- 26. Общие селекторные ролики на зависании
- 27. Как включить рекламу (объявления) в google cast (предварительные ролики, средние ролики)
- 28. Восстановить сайт веб-ролики Azure?
- 29. Обработка ошибок ролики Azure Worker
- 30. Отчет DevExpress: динамические группы работают не так, как ожидалось
Или, если на ссылочном типе будет выбрано std :: bad_cast – Ben