Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

Методология объективно-ориентированного проектирования

  1. Выбор надлежащей совокупности типов.

  2. Проектирование взаимосвязей между типами и применение наследования для использования общего кода.

  3. Использование виртуальных функций для полиморфной обработки родственных объектов.

Производный класс

с можно сделать производным от существующего с использованием следующей формы:

Class имя_класса :

(public | protected | private)opt имя_базового_класса

{

объявление членов

};

Ключевое слово Class как всегда можно заменить ключевым словом struct, если подразумевается, что все члены открыты. Одним из аспектов производного класса является видимость (открытость) его членов-наследников. Ключевые слова public, protected и private используются для указания того, насколько члены базового класса будут доступны для производного.

Ключевое слово protected введено для того, чтобы сохранить сокрытие данных для членов, которые должны быть доступны из производного класса, но в других случаях действуют как закрытые (private). Это промежуточная форма доступа между public и private.

Преимущества использования производных классов

▪ Код используется повторно. Тип grad_student использует существующий, проверенный код из student.

▪ Иерархия отражает взаимоотношения, свойственные проблемной области. Когда мы говорим о студентах, выделение аспирантов в отдельную группу заимствуется из реального мира и определяется тем, как аспиранты понимается в этом мире.

▪ Различные полимерные механизмы позволят клиентскому коду рассматривать в качестве подтипа student, что упростит клиентский код, сохраняя при этом преимущества разграничения подтипов.

Виртуальные функции

Перегруженная функция-член вызывается с учетом алгоритма соответствия типов, в который входит правило соответствия неявного аргумента объекту данного типа класса. Все это известно на этапе компиляции и позволяет компилятору напрямую выбирать надлежащий член. Как станет очевидно, было бы не плохо динамически (на этапе выполнения) выбирать соответствующую функцию-член среди функций базового и производного классов. Ключевое слово служит спецификатором функции, и как раз и представляет подобный механизм, но оно может применяться для изменения объявления только функций-членов. Сочетание виртуальных функций и открытого наследования станет для нас наиболее обобщенным и гибким способом построения программного обеспечения. Это – форма чистого полиморфизма.

Обычная виртуальная функция должна представлять собой исполняемый код. При вызове семантика ее точно такая же, как и у остальных функций. В производном типе она может замещаться (переписываться, переопределяться), и прототип производной функции должен иметь сигнатуру и возвращаемый тип , совпадающие с базовой. Выбор того, какое определение функции вызвать для виртуальной функции, происходит динамически (на этапе выполнения). Типичный случай – это когда базовый класс включает виртуальную функцию, а производные классы имеют свои версии этой функции. Указатель на базовый класс может указывать либо на объект базового класса, либо на объект производного класса. Выбор функции-члена будет зависит от класса объекта, на который фактически (на момент выполнения) направлен указатель, а не от типа указателя. При отсутствии члена производного типа используется виртуальная функция базового класса. Обратите внимание на различие между выбором надлежащей замещенной виртуальной функции и выбором перегруженной функции-члена. Перегруженная функция-член выбирается на этапе компиляции на основе сигнатуры; перегруженные функции могут иметь различные возвращаемые типы. Виртуальная функция выбирается на этапе выполнения на основе типа объекта, который передается ей в качестве аргумента-указателя this. Кроме того, будучи однажды объявленной как виртуальная, функция сохраняет это свойство во всех переопределениях в производных классах. В производных классах не обязательно использовать модификатор virtual.

Только нестатические функции-члены могут быть виртуальными. Виртуальность наследуется. Так как функция производного класса автоматически виртуальна, наличие в нем ключевого слова virtual – обычно дело вкуса. Конструкторы не могут быть виртуальными, в отличие от деструкторов. Практически, каждый класс, имеющий виртуальную функцию, должен иметь виртуальный деструктор.

Соседние файлы в папке ООП(Тимофеев)