Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

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

моделирование процесса поступления заявок в ЭВМ на GPSS + Пояснительная ...
Моделирование интернет кафе на GPSS + Отчет
База данных - рабочее место кассира на Delphi + бд Access

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

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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Интерактивный инт...
BIOS
HTMLredaktor
Библия хакера 2 К...
Дешифратор содерж...
Task Shedule
Анекдоты с ostrie.ru
Strawberry Prolog...
Редактор текста (...
Binary2XMLDemo (Р...
Система баннеро...
PHP 5. Практика с...
Image Browser [Ис...
ADVstatusbar
LaserTank [Исходн...
С/C++ Программиро...
Язык программиров...
Медиа комбайн
Counter [Исходник...
XPATComponents

Топ загрузок
Приложение Клие... 100771
Delphi 7 Enterp... 97787
Converter AMR<-... 20259
GPSS World Stud... 17014
Borland C++Buil... 14186
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5968
Visual Studio 2... 5205
Microsoft SQL S... 3661
Случайные статьи
Invalid PUBLIC def...
Обработка принимае...
Игры для программиста
Очереди с приорите...
Казино Вулкан — иг...
Что означают терми...
Введение в PHP5
using reversible р...
3.2. АНТИПАТТЕРН: ...
Поддержка 32-битны...
Для организации с...
Алгоритм перезагру...
Как найти качестве...
В объекте DataSet
Общие подходы к пр...
Мои документы
Объяснение
Геотермальная энер...
Web-сервис
Специальные функци...
Строки в стиле язы...
Пример на создан»—...
номер заказа OrderID
Профили плотности ...
TIdSMTP и TIdIMAP4...
Статистика



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


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