Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

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

Моделирование процесса обработки заданий пакетным режимом работы с квант...
База данных - словарь терминов на Delphi + Пояснительная записка
База данных - рабочее место кассира на Delphi + бд Access

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

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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Battle.Net - мони...
Простой пример ка...
Х. М. Дейтел, П. ...
Дешифратор содерж...
Редактор анимаций
Calendar
Binary2XMLDemo (Р...
С/C++ Программиро...
Delphi 2005 Учимс...
Просмотр коммент...
База игр
Реализация ЭЦП по...
AJAX и PHP. разра...
TmxOutlookBarPro
Моделирование дви...
Tag Игра "Пятнашк...
База англоязычных...
Программа "AutoRu...
Globus VCL Extent...
Encrypt Decrypt

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98030
Converter AMR<-... 20298
GPSS World Stud... 17060
Borland C++Buil... 14244
Borland Delphi ... 10376
Turbo Pascal fo... 7392
Калькулятор [Ис... 6082
Visual Studio 2... 5232
Microsoft SQL S... 3674
Случайные статьи
— обновления серти...
Терминология языка...
Трансляция списков...
RAID уровня 0
Однополярное кодир...
Перевод между сист...
Самые необычные от...
Установка съемной ...
Быстрая публикация
Иерархия классов
УНИФИКАЦИЯ СПИСКОВ...
Введение в имитаци...
Разностная схема
КОМАНДЫ
Структура программы
систем безопасност...
Гипотезы - подцели
Шаблоны функций
Руководство требуе...
Ud и lima
Eazylook
Списки моделирования
О поколениях интел...
• обучающий персон...
В Windows ХР предл...
Статистика



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


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