|
Программирование >> Структурное программирование
При защищенном наследовании открытые и защищенные элементы базового класса становятся защищенными элементами производного класса. При закрытом наследовании открытые и защищенные элементы базового класса становятся закрытыми элементами производного класса. При закрытом и защищенном наследованиях не справедливо отношение, что объект производного класса является объектом базового класса. Рис. 9.6 обобщает доступ элементов базового класса из производного класса, основывающийся на спецификаторах доступа к элементам в базовом классе и типе наследования. Первый столбец содержит спецификаторы доступа к элементам в базовом классе. Первая строка содержит типы наследования. Остальная часть таблицы указывает спецификаторы доступа к элементам базового класса, которые применимы в производном классе, и краткое описание того, как можно осуществить доступ к элементам базового класса.
Рис. 9.6. Сводка доступности элементов базового класса в производном классе 9.8. Прямые и косвенные базовые классы Базовый класс может быть прямым или косвенным базовым классом производного класса. Прямой базовый класс явно перечисляется в заголовке при объявлении производного класса. Косвенный базовый класс явно не перечисляется в заголовке производного класса; он наследуется через два или более уровней иерархии классов. 9.9. Использование конструкторов и деструкторов в производных классах Поскольку производный класс наследует элементы базового класса, то при создании объекта производного класса должен быть вызван конструктор базового класса для задания начальных значений элементам базового класса, содержащимся в объекте производного класса. В конструкторе производного класса при явном вызове конструктора базового класса может быть предусмотрен список инициализаторов элементов; в противном случае конструктор производного класса будет неявно вызывать конструктор базового класса с умолчанием. Конструкторы и операции присваивания не наследуются производными классами. Однако, конструкторы и операции присваивания производного класса могут вызывать конструкторы и операции присваивания базового класса. Конструктор производного класса всегда сначала вызывает конструктор своего базового класса для задания начальных значений тем элементам производного класса, которые идентичны элементам базового класса. Если конструктор производного класса отсутствует, то конструктор по умолчанию производного класса вызывает конструктор базового класса. Деструкторы вызываются в последовательности, обратной вызовам конструкторов, так что деструктор производного класса вызывается раньше соответствующего деструктора базового класса. Замечание по технике программирования 9.3 При создании объекта производного класса первым выполняется конструктор базового класса, затем конструкторы объектов-элементов производных классов, затем конструктор производного класса. Деструкторы вызываются в последовательности, обратной той, в которой вызывались соответствующие конструкторы. Замечание по технике программирования 9.4 Последовательность, в которой конструируются объекты-элементы, - это последовательность, в которой эти объекты объявлены в определении класса. На это не влияет последовательность, в которой перечислены инициализаторы элементов. Замечание по технике программирования 9.5 При наследовании конструкторы базовых классов вызываются в той последовательности, в которой указано наследование в определении производного класса. На это не влияет последовательность, в которой указаны конструкторы базовых классов в описании конструктора производного класса. Программа на рис. 9.7 демонстрирует последовательность, в которой вызываются конструкторы и деструкторы производного класса. Программа состоит из 5 частей. Части 1 и 2 показывают простой класс Point, содержащий конструктор, деструктор и защищенные данные-элементы х и у. Конструктор и деструктор печатают объект класса Point, для которого они активизированы. Части 3 и 4 показывают простой класс Circle, наследующий Point отрытым наследованием, содержащий конструктор, деструктор и закрытый элемент данных radius. Конструктор и деструктор печатают объект класса Circle, для которого они активизированы. Конструктор Circle активизирует также конструктор класса Point, используя список инициализаторов элементов, и передает значения а и b для задания начальных значений элементов-данных базового класса. P0INT2.H Определение класса Point tifndef P0INT2 H tdefine P0INT2 Н class Point { public: Point ( float = 0.0, float = 0.0); -Point 0; protected: float X, y; tendif конструктор с умолчанием деструктор доступно для производных классов X и у - координаты Point Рис. 9.7. Определение класса Point (чааь 1 из 5) P0INT2.CPP Определения функций-элементов класса Point tinclude <iostream.h> tinclude point2.h Конструктор класса Point Point::Point(float a, float b) { x= a; y=b; cout << Конструктор Point: [ X , << у ] endl; Деструктор класса Point Point::-Point 0 cout << Деструктор Point: [ X , у ] endl; Рис. 9.7. Определения функций-элементов класса Point (чааь 2 из 5)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |