Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2011, 10:56   #1
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию Виртуальные методы. Почему бы всегда не использовать их?

Вот например, есть класс в котором 10 обычных методов. Я их всех возьму и объявлю как виртуальные . Виртуальный метод можно переопределить в классах-потомкам, и соответственно никаких проблем не возникнет при написании классов-потомков, любой метод можно будет переопределить в потомке без необходимости лезть в базовый класс.
Какие могут быть минусы использования виртуальных мтеодов?
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 26.11.2011, 11:12   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну свобода переопределения в общем-то и есть минус.
инкапсуляцию, то не просто так придумали.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.11.2011, 12:11   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Виртуальные методы дольше вызываются
pu4koff вне форума Ответить с цитированием
Старый 26.11.2011, 13:14   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Есть языки (уже не вспомню какие), в которых все методы виртуальные.
А основная проблема в производительности.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 26.11.2011, 14:13   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Основная проблема скорее в запутанности и кривом дизайне базового класса и всей иерархии наследников в целом. Возможность переопределять все ф-ии класса может привести к появлению иерархии, в которой черт ногу сломит, пока разберется что к чему. с ростом иерархии становится все сложнее ее поддерживать в рабочем состоянии. Делая медот виртуальным, стоит задуматься, а действительно ли он должен быть виртуальным. Свободу переопределения методов стоит ограничивать. Тут я согласен с Фениксом.
Я ни разу не сталкивался с ситуацией, когда производительность программы заметно падала из-за вызовов виртуальных ф-ий. Тормоза всегда были из-за дизайна той или иной части функционала, из-за плохих структур данных и алгоритмов их обработки. В общем вызов виртуальной ф-ии медленнее, но эта задержка как правило не критична.
_Ч_ вне форума Ответить с цитированием
Старый 26.11.2011, 14:19   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Какие могут быть минусы использования виртуальных мтеодов?

минус 1:

Код:
// вызов вуртуального метода
mov     rcx, [inst]  // instance
mov     rbx, [rcx]  // VMT
call    qword ptr [rbx+8]  // VMT+offset

// вызов обычного метода
mov     rcx, [inst]  // instance
call    methodName // вуаля
минус 2:

представьте солидную иерархию классов, такую, в которой несколько сотен методов на класс — обычное дело. Это получается минимум 1KB на каждый инстанс только для хранения VMT. При этом, т.к. обычно перекрывается не более 10% методов, 90% VMT будет дублироваться из класса в класс. В Дельфи даже ввели дополнительный тип методов — dynamic, которые хранятся в своей таблице и не занимают места, если они не перекрыты. Вроде не наврал.

минус 3, соглашусь с Фениксом:

Цитата:
свобода переопределения в общем-то и есть минус.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.11.2011, 15:07   #7
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

всем, спасибо. всё понятно
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 26.11.2011, 16:44   #8
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от haruhi Посмотреть сообщение
Вот например, есть класс в котором 10 обычных методов. Я их всех возьму и объявлю как виртуальные . Виртуальный метод можно переопределить в классах-потомкам, и соответственно никаких проблем не возникнет при написании классов-потомков, любой метод можно будет переопределить в потомке без необходимости лезть в базовый класс.
Какие могут быть минусы использования виртуальных мтеодов?
В принципе, если у вас имеется наследование, а поведение функции должно зависеть от конкретного класса, то так и поступают, то есть делают все методы виртуальными. Это в том случае, когда используется идиома, что производный класс - это экземпляр базового класса.
Но, во-первых, не все класса проектируются таким образом, что они должны наследоваться. Во-вторых, не все функции меняют реаизацию в зависимости от принадлежности к классу. В-третьих, не всегда используется открытое наследование, то есть реализуется идиома "объект производного класса есть объект базового класса".
Что касается технической стороны, то естественно при использовании виртуальных функций размер класса увеличивается, так как добавляется указатель на таблицу виртуальных функций. Да и сама таблица виртуальных функций занимает место.
В качестве примера классов, которые не предназначены для построения иерархий, можно привести классы стандартных контейнеров.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальные методы peplenko C# (си шарп) 8 09.04.2011 04:40
Почему виртуальные методы и деструкторы нельзя делать шаблонными??? mike_tihomirov Общие вопросы C/C++ 3 14.12.2010 15:03
Виртуальные методы Kn793 Общие вопросы C/C++ 5 26.06.2010 15:08
Полиморфизм и виртуальные методы Викдон Общие вопросы Delphi 1 02.02.2009 04:40
Кто сможет разъяснить как и зачем использовать виртуальные функции в C++? Dunhil Помощь студентам 5 20.12.2007 14:19