|
Программирование >> Структурное программирование
Рис. 9.1. Некоторые простые примеры наследования Член общества / \ Служащий Студент Факультет Вспомогательный Администратор Преподаватель Рис. 9.2. Иерархия наследования для членов университетского сообщества Другой реальной иерархией наследования является иерархия Shape (форма) на рис. 9.3. Типичным для студентов, впервые изучающих объектно-ориентированное программирования, является то, что они не привыкли воспринимать богатство примеров иерархии наследования в реальном мире в рассматриваемых нами категориях; так что нужна некоторая корректировка их мышления. Чтобы указать, что класс CommissionWorker порожден классом Employee, класс CommissionWorker должен быть определен следующим образом: class CommissionWorker : public Employee { классами. Класс, конечно, может существовать сам по себе, но когда класс используется в механизме наследования, этот класс становится либо базовым классом, который снабжает атрибутами и функциями другие классы, либо производным классом, который наследует эти атрибуты и функции. Разработаем простую иерархию наследования. Типичное университетское сообщество состоит из тысяч людей, являющихся его членами. Эти люди делятся на студентов и служащих. Служащие - либо члены факультета, либо вспомогательный персонал. Члены факультета - либо администраторы (деканы и начальники курсов), либо преподаватели факультета. Это дает иерархию наследования, показанную на рис. 9.2. Форма Двумерная форма Трехмерная форма Круг Квадрат Треугольник Сфера Куб Тетраэдр Рис. 9.3. Часть иерархии класса Shape 9.3. Защищенные элементы Открытые элементы базового класса доступны всем функциям программы. Закрытые элементы базового класса доступны только функциям-элементам и друзьям базового класса. Защищенный уровень доступа служит промежуточным уровнем защиты между открытым доступом и закрытым доступом. Защищенные элементы базового класса могут быть доступны только элементам и друзьям базового класса и элементам и друзьям производного класса. Элементы производного класса могут ссылаться на открытые и защищенные элементы базового класса простым использованием имен этих элементов. Защищенные данные взламывают инкапсуляцию: изменение защищенных элементов базового класса может потребовать модификации всех производных классов. 9.4. Приведение типов указателей базовых классов к указателям производных классов Объекты открыто порожденного класса могут также рассматриваться как объекты соответствующего ему базового класса. Это ведет к некоторым интересным следствиям. Например, вопреки тому факту, что объекты различных классов, порожденных одним базовым классом, могут существенно отличаться друг от друга, мы можем создать их связный список, поскольку мы рассмат- Это называется открытым наследованием (public inheritance). Мы обсудим также закрытое наследование (private inheritance) и защищенное наследование (protected inheritance). При открытом наследовании открытые и защищенные элементы базового класса наследуются как открытые и защищенные элементы производного класса соответственно. Помните, что закрытые элементы базового класса не доступны в производных классах. Можно рассматривать объекты базового и производного классов как подобные; их общность выражается в атрибутах и функциях базового класса. Все объекты любых классов, открыто порожденных общим базовым классом, могут рассматриваться как объекты этого базового класса. Мы рассмотрим много примеров, в которых мы сможем на основе этого отношения добиться простоты программирования, что недоступно для не объектно-ориентированных языков, таких, как С. риваем их как объекты базового класса. Но обратное неверно: объекты базового класса не являются автоматически объектами производного класса. Типичная ошибка программирования 9.1 Рассмотрение объектов базового класса как объектов производного класса может вызвать ошибки. Программист может, однако, использовать явное приведение типов для преобразования указателей базового класса в указатели производного класса. Но будьте внимательны: если такой указатель должен разыменовываться, программисту надо быть уверенным, что тип указателя соответствует типу объекта, на который он указывает. Типичная ошибка программирования 9.2 Явное приведение типа указателя базового класса, который указывает на объект базового класса, к типу указателя производного класса и затем ссылка на элементы производного класса, которые не существуют в этом объекте. Наш первый пример показан на рис. 9.4, части с 1 по 5. Части 1 и 2 показывают определение класса Point (точка) и определения функций-элементов класса Point. Части 3 и 4 показывают определение класса Circle (круг) и определение функций-элементов класса Circle. Часть 5 показывает программу драйвер, в которой мы демонстрируем присваивание указателей производного класса указателям базового класса и приведение типов указателей базового класса к указателям производного класса. Исследуем сначала определение класса Point (Рис. 9.4, часть 1). Открытый интерфейс класса Point содержит функции-элементы setPoint, getX и getY. Данные-элементы х и у класса Point указаны как protected - защищенные. Это запрещает клиентам объектов класса Point прямой доступ к данным, но позволяет классам, порожденным классом Point, иметь непосредственный доступ к унаследованным данным-элементам. Если бы эти данные были определены как private, то для доступа к ним даже в производном классе надо было бы использовать открытые функции-элементы класса Point. POINT.Н Определение класса Point #ifndef POINT H #define POINT H class Point { friend ostream Soperator (ostream &, const Point &); public: Point(float = 0, float = 0); конструктор с умолчанием void setPoint(float, float); установка координат float getXO const { return x; } получение координаты x float getYO const { return y; } получение координаты у protected: доступно для производных классов float X, у; координаты Point х и у #endif
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |