V. Объектно-ориентированное программирование
V. Объектно-ориентированное программирование
Объектно-ориентированное программирование расширяет объектное программирование, вводя отношения тип-подтип с помощью механизма, именуемого наследованием. Вместо того чтобы заново реализовывать общие свойства, класс наследует данные-члены и функции-члены родительского класса. В языке C++ наследование осуществляется посредством так называемого порождения производных классов. Класс, свойства которого наследуются, называется базовым, а новый класс - производным. Все множество базовых и производных классов образует иерархию наследования.
Например, в трехмерной компьютерной графике классы OrthographicCamera и PerspectiveCamera обычно являются производными от базового Camera. Множество операций и данных, общее для всех камер, определено в абстрактном классе Camera. Каждый производный от него класс реализует лишь отличия от абстрактной камеры, предоставляя альтернативный код для унаследованных функций-членов либо вводя дополнительные члены.
Если базовый и производный классы имеют общий открытый интерфейс, то производный называется подтипом базового. Так, PerspectiveCamera является подтипом класса Camera. В C++ существует специальное отношение между типом и подтипом, позволяющее указателю или ссылке на базовый класс адресовать любой из производных от него подтипов без вмешательства программиста. (Такая возможность манипулировать несколькими типами с помощью указателя или ссылки на базовый класс называется полиморфизмом.) Если дана функция:
void lookAt( const Camera *pCamera );
то мы реализуем lookAt(), программируя интерфейс базового класса Camera и не заботясь о том, на что указывает pCamera: на объект класса PerspectiveCamera, на объект класса OrthographicCamera или на объект, описывающий еще какой-то вид камеры, который мы пока не определили.
При каждом вызове lookAt() ей передается адрес объекта, принадлежащего к одному из подтипов Camera. Компилятор автоматически преобразует его в указатель на подходящий базовый класс:
// правильно: автоматически преобразуется в Camera*
OrthographicCamera ocam;
lookAt( &ocam );
// ...
// правильно: автоматически преобразуется в Camera*
PerspectiveCamera *pcam = new PerspectiveCamera;
lookAt( pcam );
Наша реализация lookAt() не зависит от набора подтипов класса Camera, реально существующих в приложении. Если впоследствии потребуется добавить новый подтип или исключить существующий, то изменять реализацию lookAt() не придется.
Полиморфизм подтипов позволяет написать ядро приложения так, что оно не будет зависеть от конкретных типов, которыми мы манипулируем. Мы программируем открытый интерфейс базового класса придуманной нами абстракции, пользуясь только ссылками и указателями на него. При работе программы будет определен фактический тип адресуемого объекта и вызвана подходящая реализация открытого интерфейса.
Нахождение (или разрешение) нужной функции во время выполнения называется динамическим связыванием (dynamic binding) (по умолчанию функции разрешаются статически во время компиляции). В C++ динамическое связывание поддерживается с помощью механизма виртуальных функций класса. Полиморфизм подтипов и динамическое связывание формируют основу объектно-ориентированного программирования, которому посвящены следующие главы.
В главе 17 рассматриваются имеющиеся в C++ средства поддержки объектно-ориентированного программирования и изучается влияние наследование на такие механизмы, как конструкторы, деструкторы, почленная инициализация и присваивание; для примера разрабатывается иерархия классов Query, поддерживающая систему текстового поиска, введенную в главе 6.
Темой главы 18 является изучение более сложных иерархий, возможных за счет использования множественного и виртуального наследования. С его помощью мы развернем шаблон класса из главы 16 в трехуровневую иерархию.
В главе 19 обсуждается идентификация типов во время выполнения (RTTI), а также изучается вопрос о влиянии наследования на разрешение перегруженных функций. Здесь мы снова обратимся к средствам обработки исключений, чтобы разобраться в иерархии классов исключений, которую предлагает стандартная библиотека. Мы покажем также, как написать собственные такие классы.
Глава 20 посвящена углубленному рассмотрению библиотеки потокового ввода/вывода iostream. Эта библиотека представляет собой иерархию классов, поддерживающую как виртуальное, так и множественное наследование.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА JAVA 7. КЛАССЫ
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА JAVA 7. КЛАССЫ Базовым элементом объектно-ориентированного программирования в языке Java является класс. В этой главе Вы научитесь создавать и расширять свои собственные классы, работать с экземплярами этих классов. Напомним,
Объектно-ориентированное моделирование
Объектно-ориентированное моделирование 3ds Max 2008 – объектно-ориентированная программа, то есть все, что создается в программе, является объектами. Геометрия, камеры и источники света на сцене – это объекты. Объектами также являются модификаторы, контроллеры, растровые
Объектно-ориентированное программирование и VBA
Объектно-ориентированное программирование и VBA В результате своей эволюции Visual Basic превратился в (почти) объектно-ориентированный язык программирования. Хотя освоение приемов работы с объектами и представляет некоторую трудность в начале знакомства с VBA, ожидаемая
Глава 12. Объектно-ориентированное программирование.
Глава 12. Объектно-ориентированное программирование. В этой главе ...~ Концептуализация объектов~ Понимание свойств, методов и событий - главных компонентов VBA-объектов~ Работа с объектными моделями~ Использование форм как объектов~ Выяснение и установка свойств объектов~
Глава 6 Наследование и объектно-ориентированное проектирование
Глава 6 Наследование и объектно-ориентированное проектирование Объектно-ориентированное программирование (ООП) существует почти 20 лет, поэтому, вероятно, вы имеете некоторое представление о наследовании, производных классах и виртуальных функциях. Даже если вы
4.5. Unix и объектно-ориентированные языки
4.5. Unix и объектно-ориентированные языки С середины 80-х годов прошлого века большинство новых конструкций языков обладают собственной поддержкой объектно-ориентированного программирования (Object-Oriented Programming — OO). Напомним, что в объектно-ориентированном программировании
1.1. Введение в объектно-ориентированное программирование
1.1. Введение в объектно-ориентированное программирование Прежде чем начать разговор о самом языке Ruby, неплохо было бы потолковать об объектно-ориентированном программировании вообще. Поэтому сейчас мы вкратце рассмотрим общие идеи, лишь слегка касаясь
Объектно-ориентированное программирование
Объектно-ориентированное программирование Абстракция, наследование, полиморфизм, инкапсуляцияГоворя об ООП (объектно-ориентированном программировании), нельзя обойти стороной эти четыре базовых понятия. Поэтому ниже будет приведено их краткое описание.Абстракция –
2.4. Объектно-ориентированный подход
2.4. Объектно-ориентированный подход Вспомним спецификацию нашего массива в предыдущем разделе. Мы говорили о том, что некоторым пользователям может понадобиться упорядоченный массив, в то время как большинство, скорее всего, удовлетворится и неупорядоченным. Если
Процедурно-ориентированное программирование
Процедурно-ориентированное программирование В части II были представлены базовые компоненты языка С++: встроенные типы данных (int и double), типы классов (string и vector) и операции, которые можно совершать над данными. В части III мы увидим, как из этих компонентов строятся
17.1.1. Объектно-ориентированное проектирование
17.1.1. Объектно-ориентированное проектирование Из чего складывается объектно-ориентированное проектирование четырех рассмотренных выше видов запросов? Как решаются проблемы их внутреннего представления?С помощью наследования можно определить взаимосвязи между
Объектно-ориентированное моделирование
Объектно-ориентированное моделирование Общепринятой философией в большинстве современных графических систем при создании чертежей на компьютере является использование наипростейших геометрических примитивов: точек, отрезков и дуг. С помощью различных комбинаций
Объектно-ориентированное программирование
Объектно-ориентированное программирование Питон - объектно-ориентированный язык со множественным наследованием. Можно сказать, что Питон поддерживает классическую ОО-модель с некоторыми особенностями. Классы в Python могут иметь статические переменные, разделяемые
Объектно-ориентированное конструирование ПО
Объектно-ориентированное конструирование ПО У нас уже накоплено достаточно оснований, чтобы попытаться определить ОО-конструирование ПО. Это будет лишь первый набросок, более конкретное определение последует в следующей лекции.ОО-конструирование ПО (определение 1)
Конструирование объектно-ориентированного ПО
Конструирование объектно-ориентированного ПО Мы уже давали определение конструирования ОО-ПО: будучи весьма общим, оно представляет метод следующим образом: "основывать архитектуру всякой программной системы на модулях, полученных из типов объектов, с которыми