реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> GCC и C++ для Cortex-M3
Brain13
сообщение Jan 18 2013, 05:48
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(dxp @ Jan 16 2013, 11:37) *
1. Что такое абстрактные методы?

Абстрактный метод = виртуальный метод без реализации.

Цитата(dxp @ Jan 16 2013, 11:37) *
2. RTTI - Run-Time Type Identification - определение типа на этапе выполнения. Причём тут полиморфизм, который требует просто наследования и виртуальных функций, механизм реализации которых - это таблицы указателей на функции? Для полиморфизма не требуется никакая информация о типах на этапе выполнения.

RTTI потребуется, если будете использовать dynamic_cast<>.


Хммм... а я думал что, для вызова виртуальных методов необходимо вначале узнать реальный тип объекта, а лишь затем вызвать его переопределенный метод. Я считал, что определением реального типа объекта и занимается rtti. Походу я чего-то не понимаю.

Вот в вике написано о виртуальных методах:
Цитата(http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4)
То есть, в случае виртуальной функции, для определения реализации функции используется информация о типе объекта и вызывается «правильная» реализация, независимо от типа указателя. При вызове невиртуальной функции, компилятор руководствуется типом указателя или ссылки, поэтому вызываются две разные реализации function2(), несмотря на то, что используется один и тот же объект.

Так получается что инфа о типе не используется, а используется таблица указателей на виртуальные функции (vtbl)?

А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик?
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 18 2013, 12:01
Сообщение #17


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (Brain13 @ Jan 18 2013, 12:48) *
Абстрактный метод = виртуальный метод без реализации.

Это называется "чистая виртуальная" - pure virtual - функция. Никаких абстрактных методов в С++ нет, есть только абстрактные базовые классы. Кстати, "виртуальный метод" - масло масляное. В терминах С++ виртуальная функция - это и есть метод. Т.е. функции-члены могут быть обычными и виртуальными, последние и являются методами, а обычные функции-члены остаются обычными функциями-членами, никакими методами они не являются.


QUOTE (Brain13 @ Jan 18 2013, 12:48) *
Хммм... а я думал что, для вызова виртуальных методов необходимо вначале узнать реальный тип объекта, а лишь затем вызвать его переопределенный метод. Я считал, что определением реального типа объекта и занимается rtti. Походу я чего-то не понимаю.

Реальный тип объекта и узнаётся... на этапе компиляции. Компилятор смотрит тип объекта и проверяет, можно ли для этого типа вызвать виртуальную функцию. Если можно, то организует вызов, но не прямой, как в случае с обычной функцией, а через указатель vtbl, откуда извлекается указатель на вызываемую функцию. Всё организуется на этапе компиляции.

QUOTE (Brain13 @ Jan 18 2013, 12:48) *
Вот в вике написано о виртуальных методах:

Мутно написано. Правильный вариант - см выше.

QUOTE (Brain13 @ Jan 18 2013, 12:48) *
А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик?

RTTI нужно, когда действительно надо на рантайме решить, что делать с объектом. Например, есть некий приёмник сообщений, сообщения могут быть разного типа, и нужно каждый тип обрабатывать по-своему. Вот тут информация о типе и нужна реально. dynamic_cast<> позволяет проверить соответствие объекта ожидаемому типу. Накладные расходы, зато можно строить систему, которую не нужно каждый раз пересобирать при добавлении/изменении типов сообщений. Кстати, стандартный механизм RTTI универсален и довольно тяжёл, поэтому в embedded частенько имеет смысл реализовывать что-то своё (внедрение информации о типе в объекты).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 08:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016