Перейти к содержанию
    

1. Что такое абстрактные методы?

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

 

2. RTTI - Run-Time Type Identification - определение типа на этапе выполнения. Причём тут полиморфизм, который требует просто наследования и виртуальных функций, механизм реализации которых - это таблицы указателей на функции? Для полиморфизма не требуется никакая информация о типах на этапе выполнения.

 

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

 

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

 

Вот в вике написано о виртуальных методах:

То есть, в случае виртуальной функции, для определения реализации функции используется информация о типе объекта и вызывается «правильная» реализация, независимо от типа указателя. При вызове невиртуальной функции, компилятор руководствуется типом указателя или ссылки, поэтому вызываются две разные реализации function2(), несмотря на то, что используется один и тот же объект.

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

 

А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

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

 

Вот в вике написано о виртуальных методах:

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

 

А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...