![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Плюс понятнен это быстрее через vTable , в чем минусы ?
|
|||
|
||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Подозреваю: минусы - в отсутствии полиморфизма?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Подобные подходы используют по разным причинам. Вот у тебя один из примеров, как это можно использовать. Правда, на мой взгляд, так никто не делает в силу того, что подход будет ничем не быстрее vtable, а может быть и медленнее.
Из головы примеры придумать сложно(как правило такие подходы используют в конкретных контекстах), лучше рассматривать конкретные примеры. Так же в каждом случае будут свои плюсы и минусы. |
|||
|
||||
sergioK1 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Нет поиска в таблице виртуальных функций , а это чуть медленнее, Хотя наследование это лишь частный случай
т,е, Я принимаю интерфэйс , ZeusAtVingrad полиморфизм чистой воды только на стадии компиляции, проблема в том что конструктор класса Any может быть еще не вызван , т,е, если метод скажем делает скажем value++ , где value - private member , то он не проинициализирован , как мне закрыть эту дыра |
||||
|
|||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Что-то мало что понял.
Просто у меня отложилось, что в C++ полиморфизм это - виртуальные функции. Ну и логично предположить, что если нет виртуальных функций, то и полиморфизма нет. |
|||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Какого поиска? там всё на индексах.
у тебя правильно отложилось, правда шаблоны иногда называют "статическим" полиморфизмом, но это не совсем то о чем обычно говорят при обсуждении полиморфизма. |
||||
|
|||||
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Вот Я тоже подозреваю , а поподробней про индексы есть ссылки ?? |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
поищи любым поисковиком на предмет реализации таблицы виртуальных функций в интересующем тебя компиляторе. У меня под рукой ссылок нет.
|
|||
|
||||
Lukkoye |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Что такое "запуск через vtbl" ? Это - запуск функции, адрес которой находится по указателю. Если сказать совсем просто: "запуск функции не напрямую, а через указатель". Теперь внимательно смотрим на ваш пример:
Что мы видим? Мы видим получение указателя, и запуск через этот указатель. Вам это ничего не напоминает? Итого: данный способ не имеет профита к скорости работы по сравнению с vtbl, поскольку использует тот же самый принцип действия. Кто-то может сказать: умный компилятор может оптимизировать второй вариант, поскольку во втором варианте на этапе компиляции можно вычислить значения всех адресов. И это действительно так. Правда в том, что такой умный компилятор сможет соптимизировать и виртуальную функцию тоже. Минус данного подхода в том, что это ничто иное, как велосипед, который вручную имитирует работу виртуального полиморфизма. Минус здесь - код становится сложнее. Возможные ошибки на совести программиста, а не компилятора. Базовый класс - шаблонный, поэтому его целиком придется держать в хэдере. И тп. Резюмируя: нет ни одной причины делать в ручную то, что за вас может сделать умная автоматика. В ручную нужно делать лишь то, что автоматика сделать не может. Для шаблонных базовых классов, есть своя область применения. Например:
Если же вам по задаче понадобилось использовать полиморфизм - используйте полиморфизм. Предоставьте дело автоматике. Сделать косвенную адресацию эффективнее, чем это может сделать компилятор у вас все равно не получится. |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в С++ два вида полиморфизма - динамический (виртуальные функции) и статический (шаблоны). отсюда сразу ясно в чем минусы виртуальности через шаблоны - это не подходит в случаях, когда тип неизвестен во время компиляции. то, о чем идет речь, называется CRTP, и его применение не ограничиваются приведенным примером. впрочем, все они статические ![]() |
|||
|
||||
sergioK1 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
когда неизвестен на этапе компиляции делаеться фабрика , ее, как вариант, можно сделать внутри template , Когда еще вы применяли CRTP ?, меня именно это и интересует |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
это для создания объекта. а при создании объекта (динамический) полиморфизм непричем.
кстати фабрика тоже может быть статической или динамической. CRTP применяется для более четкого разделения интерфейса и реализации: это mixins и статический полиморфизм. Пользоваться тем, что базовый класс знает точный типа объекта, можно не только для статического полиморфизма, но и например для реализации клонирования, вроде
|
|||
|
||||
sergioK1 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Мне всегда казалось что наследование лучше там где точно знаешь что интерфейс базового класса не будет меняться, про "более четкое разделения интерфейса и реализации" не допонял , что не четко |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |