Brain13 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба 1. Что такое абстрактные методы? Абстрактный метод = виртуальный метод без реализации. 2. RTTI - Run-Time Type Identification - определение типа на этапе выполнения. Причём тут полиморфизм, который требует просто наследования и виртуальных функций, механизм реализации которых - это таблицы указателей на функции? Для полиморфизма не требуется никакая информация о типах на этапе выполнения. RTTI потребуется, если будете использовать dynamic_cast<>. Хммм... а я думал что, для вызова виртуальных методов необходимо вначале узнать реальный тип объекта, а лишь затем вызвать его переопределенный метод. Я считал, что определением реального типа объекта и занимается rtti. Походу я чего-то не понимаю. Вот в вике написано о виртуальных методах: То есть, в случае виртуальной функции, для определения реализации функции используется информация о типе объекта и вызывается «правильная» реализация, независимо от типа указателя. При вызове невиртуальной функции, компилятор руководствуется типом указателя или ссылки, поэтому вызываются две разные реализации function2(), несмотря на то, что используется один и тот же объект. Так получается что инфа о типе не используется, а используется таблица указателей на виртуальные функции (vtbl)? А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 53 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба Абстрактный метод = виртуальный метод без реализации. Это называется "чистая виртуальная" - pure virtual - функция. Никаких абстрактных методов в С++ нет, есть только абстрактные базовые классы. Кстати, "виртуальный метод" - масло масляное. В терминах С++ виртуальная функция - это и есть метод. Т.е. функции-члены могут быть обычными и виртуальными, последние и являются методами, а обычные функции-члены остаются обычными функциями-членами, никакими методами они не являются. Хммм... а я думал что, для вызова виртуальных методов необходимо вначале узнать реальный тип объекта, а лишь затем вызвать его переопределенный метод. Я считал, что определением реального типа объекта и занимается rtti. Походу я чего-то не понимаю. Реальный тип объекта и узнаётся... на этапе компиляции. Компилятор смотрит тип объекта и проверяет, можно ли для этого типа вызвать виртуальную функцию. Если можно, то организует вызов, но не прямой, как в случае с обычной функцией, а через указатель vtbl, откуда извлекается указатель на вызываемую функцию. Всё организуется на этапе компиляции. Вот в вике написано о виртуальных методах: Мутно написано. Правильный вариант - см выше. А что тогда делает rtti, и зачем нужен dynamic_cast<>? Можно примерчик? RTTI нужно, когда действительно надо на рантайме решить, что делать с объектом. Например, есть некий приёмник сообщений, сообщения могут быть разного типа, и нужно каждый тип обрабатывать по-своему. Вот тут информация о типе и нужна реально. dynamic_cast<> позволяет проверить соответствие объекта ожидаемому типу. Накладные расходы, зато можно строить систему, которую не нужно каждый раз пересобирать при добавлении/изменении типов сообщений. Кстати, стандартный механизм RTTI универсален и довольно тяжёл, поэтому в embedded частенько имеет смысл реализовывать что-то своё (внедрение информации о типе в объекты). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться