|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.11.2011, 10:56 | #1 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
Виртуальные методы. Почему бы всегда не использовать их?
Вот например, есть класс в котором 10 обычных методов. Я их всех возьму и объявлю как виртуальные . Виртуальный метод можно переопределить в классах-потомкам, и соответственно никаких проблем не возникнет при написании классов-потомков, любой метод можно будет переопределить в потомке без необходимости лезть в базовый класс.
Какие могут быть минусы использования виртуальных мтеодов?
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
26.11.2011, 11:12 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
ну свобода переопределения в общем-то и есть минус.
инкапсуляцию, то не просто так придумали. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
26.11.2011, 12:11 | #3 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Виртуальные методы дольше вызываются
|
26.11.2011, 13:14 | #4 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Есть языки (уже не вспомню какие), в которых все методы виртуальные.
А основная проблема в производительности.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
26.11.2011, 14:13 | #5 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
Основная проблема скорее в запутанности и кривом дизайне базового класса и всей иерархии наследников в целом. Возможность переопределять все ф-ии класса может привести к появлению иерархии, в которой черт ногу сломит, пока разберется что к чему. с ростом иерархии становится все сложнее ее поддерживать в рабочем состоянии. Делая медот виртуальным, стоит задуматься, а действительно ли он должен быть виртуальным. Свободу переопределения методов стоит ограничивать. Тут я согласен с Фениксом.
Я ни разу не сталкивался с ситуацией, когда производительность программы заметно падала из-за вызовов виртуальных ф-ий. Тормоза всегда были из-за дизайна той или иной части функционала, из-за плохих структур данных и алгоритмов их обработки. В общем вызов виртуальной ф-ии медленнее, но эта задержка как правило не критична. |
26.11.2011, 14:19 | #6 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> Какие могут быть минусы использования виртуальных мтеодов?
минус 1: Код:
представьте солидную иерархию классов, такую, в которой несколько сотен методов на класс — обычное дело. Это получается минимум 1KB на каждый инстанс только для хранения VMT. При этом, т.к. обычно перекрывается не более 10% методов, 90% VMT будет дублироваться из класса в класс. В Дельфи даже ввели дополнительный тип методов — dynamic, которые хранятся в своей таблице и не занимают места, если они не перекрыты. Вроде не наврал. минус 3, соглашусь с Фениксом: Цитата:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
26.11.2011, 15:07 | #7 |
Форумчанин
Регистрация: 05.10.2011
Сообщений: 368
|
всем, спасибо. всё понятно
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
|
26.11.2011, 16:44 | #8 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Но, во-первых, не все класса проектируются таким образом, что они должны наследоваться. Во-вторых, не все функции меняют реаизацию в зависимости от принадлежности к классу. В-третьих, не всегда используется открытое наследование, то есть реализуется идиома "объект производного класса есть объект базового класса". Что касается технической стороны, то естественно при использовании виртуальных функций размер класса увеличивается, так как добавляется указатель на таблицу виртуальных функций. Да и сама таблица виртуальных функций занимает место. В качестве примера классов, которые не предназначены для построения иерархий, можно привести классы стандартных контейнеров.
Со мной можно встретиться на www.clipper.borda.ru
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Виртуальные методы | 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 |