Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Бип из системно... 65535
Пример работы с... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
21 ошибка прогр... 65535
Гостевая книга ... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Содержание сайт... 65535
Invision Power ... 65535
Программируемая... 65535
Оператор выбора... 65535
Модуль Forms 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,145
новичок: ChangeInfo
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
База данных - рабочее место кассира на Delphi + бд Access
Расчет мер близости на отношениях на Delphi + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Немного философии
Любой класс имеет две стороны медали: интерфейс и реализацию. Чтобы хоть как-то упорядочить наши знания в этом вопросе, давайте порассуждаем, что и в каких случаях мы наследуем. С закрытым наследованием все вроде бы ясно: это — наследование реализации, так как ни клиенты, ни последующие наследники «не видят» интерфейса при закрытом наследовании, если только его специально не открыть.

Совсем другое дело — открытое наследование. Здесь все видят все, поэтому важно понимать, что и в каких случаях наследуется. Понятно, что интерфейс класса наследуется всегда. Но при открытом наследовании существуют важные концептуальные различия в наследовании обычных, виртуальных и чисто виртуальных функций.
Совершенно очевидно, что объявление чисто виртуальной функции предполагает наследование только интерфейса, оставляя реализацию классам-наследникам. Даже если чисто виртуальная функция имеет определение, это определение не наследуется и класс-наследник остается абстрактным.
Если функция не объявлена виртуальной, то изменение ее поведения в наследниках, очевидно, не предполагается. Поэтому можно сказать (хотя это и не поддерживается непосредственно в языке), что реализация невиртуальной функции является обязательной для классов-наследников — они не должны ее изменять.
Труднее разобраться, что же мы наследуем, если функция объявлена виртуальной. С одной стороны, мы вроде бы не собираемся наследовать реализацию — именно для этого функция объявлена виртуальной. С другой стороны, мы не объявили эту функцию чистой виртуальной — значит, предполагается, что реализация все-таки пригодится. Как правильно заметил Скотт Мейерс в [23], в этом случае мы наследуем реализацию по умолчанию: если мы не переопределим виртуальную функцию в наследнике, то будет работать базовая реализация по умолчанию.
Заметьте, что определение чистой виртуальной функции не является реализацией по умолчанию — мы должны явным образом вызывать такую функцию в методе-наследнике.
В [27] приводится интересная классификация форм наследования. Как и всякая классификация, эта — личное мнение автора книги [27]. Однако она может служить отправной точкой для понимания, с какой целью мы применяем этот мощнейший механизм — наследование. Автор считает, что порождение дочернего класса может быть выполнено по следующим причинам:
? Специализация. Класс-наследник является специализированной формой родительского класса — в наследнике просто переопределяются методы. Принцип подстановки выполняется. Очевидно, что такая форма наследования в С++ реализуется простым открытым наследованием. Примером является наследование часы будильник.
Спецификация. Дочерний класс реализует поведение, описанное в родительском классе. Ясно, что в С++ эта форма реализуется простым открытым наследованием от абстрактного класса.
Конструирование. Класс-наследник использует методы базового класса, но не является его подтипом (принцип подстановки не выполняется). В С++ такую форму можно реализовать простым закрытым наследованием.
Расширение. В класс-потомок добавляют новые методы, расширяя поведение родительского класса; принцип подстановки в такой форме выполняется.
Обобщение. Дочерний класс обобщает поведение базового класса. Обычно такое наследование требуется в тех случаях, когда мы не можем изменить поведение базового класса (например, базовый класс является библиотечным).
Ограничение. Класс-наследник ограничивает поведение родительского класса. Очевидно, что в С++ такой вид наследования реализуется простым закрытым наследованием (пример — TDeque -> TStack).
Варьирование. Базовый и производный классы являются вариациями на одну тему, однако связь «класс-подкласс» произвольна, например, «квадрат-прямоугольник» или «прямоугольник-квадрат» . Эта форма фактически не отличается от «конструирования», так как класс-наследник, очевидно, «использует методы базового класса, но не является его подтипом».
Комбинирование. Дочерний класс наследует черты нескольких классов — это множественное наследование (см. главу 10).
Наследование — это огромный пласт С++, которого мы в этой главе только коснулись.
Опубликовал Kest Ноябрь 24 2013 08:18:09 · 0 Комментариев · 2731 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Игра Car [Исходни...
Assembler. Практикум
Эффект лампы на р...
XPATComponents
Globus VCL Extent...
Х. М. Дейтел, П. ...
CoolHints2k
Еext Editor
Как программирова...
Игра PackMan
Создание меню на ...
Java 2. Наиболее ...
PHP 5 для "чайников"
Панель статистики...
Платформа програм...
Adapter (пример D...
SMExport
Пример OpenGL гра...
CodeGear RAD Stud...
Фундаментальные а...

Топ загрузок
Приложение Клие... 100667
Delphi 7 Enterp... 95077
Converter AMR<-... 20178
GPSS World Stud... 16621
Borland C++Buil... 13838
Borland Delphi ... 9669
Turbo Pascal fo... 7217
Калькулятор [Ис... 5557
Visual Studio 2... 5112
FreeSMS v1.3.1 3613
Случайные статьи
Каково значение ад...
Потери памяти при ...
ДОПУСТИМЫЕ СПОСОБЫ...
Если вы применяете...
Ваша программа дол...
Эмуляция директивы...
Иногда требуется б...
Тестирование
АНТИПАТТЕРН: ИСПОЛ...
Восстановление дан...
Миссия II. FACILIT...
Дорвеи и поисковые...
Многостраничные ко...
Игры для взрослых
Рабочий стол Windo...
Эта конфигурация н...
Игры. Безопасность...
Карта START
• Раскрытие циклов...
Правила транспорта
listing (A)
Изготовление монок...
Сегментирование кл...
Классификация и ст...
put(X)
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?