Суббота, 18.05.2024, 15:41Приветствую Вас Гость | RSS
IT Solutions
Меню сайта
Наш опрос
Оцените мой сайт
Всего ответов: 407
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Каталог статей


Главная » Статьи » Мои статьи

Виртуальность и открытость функций
В базовых классах с высокой стоимостью изменений (библиотеки), лучше делать открытые функции не виртуальными.

Виртуальные функции лучше делать private или protected, если производный класс должен иметь возможность вызывать их базовые версии ( исключение - деструкторы ).

Открытая virtual функция изначально решает две различные задачи:
1. Она определяет интерфейс
  • Будучи открытой, такая функция является непосредственной частью интерфейса класса, предоставленного внешнему миру.
2. Она определяет детали реализации
  • Будучи виртуальной, функция предоставляет производному классу возможность заменить базовую реализацию этой функции (если она была) в чём и состоит цель настройки.
Так как цели этих задач, поставленных перед virtual функцией, различны, то они начинают конфликтовать друг с другом, потому что одна функция не может полностью решить одновременно две задачи.

Преимущества разделения открытых функций от виртуальных:
1. Каждый интерфейс может приобрести свой естественный вид
  • Когда мы разделяем открытый интерфейс от интерфейса настройки, каждый из них может легко приобретать тот вид, который для него наиболее естественен, не пытаясь найти компромисс, который заставит их выглядеть идентично.
Часто они требуют различного количества функций или параметров.

2. Управление базовым классом
  • Теперь базовый класс находится под полным контролем своего интерфейса и может обеспечить пост - и предусловия интерфейса, причём выполнить всю эту работу в одном повторно используемом месте - не виртуальные функции интерфейса
3. Базовый класс более устойчив к изменениям
  • Мы можем позже добавить проверку пост- или предусловий, или разделить выполнение работы на большее количество шагов  или переделать её, реализовать более подробное разделение интерфейса и реализации с использованием Pimpl и т. п. в базовом классе. Всё это никак не повлияет на код, использующий данный класс или наследующий его.
Исключения:
"NVI" не выполним к деструкторам в связи со специальным порядком их выполнения.
Если требуется ковариантность в возвращаемом типе, видимая вызывающему коду без использования dynamic_cast, то проще сделать виртуальную функцию открытой.
Категория: Мои статьи | Добавил: B@R_LOG (18.11.2013)
Просмотров: 768 | Теги: виртуальные функции, открытые функции закрытые функции, задачи virtual функции, не виртуальные функции | Рейтинг: 2.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Категории раздела
Мои статьи [11]
Поиск
Друзья сайта
  • МЫ в "ВКонтакте"
  • Система Orphus