|
Программирование >> Структурное программирование
В этом учебном примере делается упор на то, что классы могут наследовать и интерфейс, и реализацию базового класса. В иерархиях, проектируемых для наследования реализации, стремятся обеспечить функциональные возможности на возможно более высоких уровнях, чтобы каждый новый производный класс мог наследовать функции-элементы, описанные в базовом классе, и использовать эти описания. В иерархиях, проектируемых для наследования интерфейса, стремятся обеспечить функциональные возможности на возможно более низких уровнях: базовый класс объявляет функции, которые должны вызываться идентично для каждого объекта в иерархии (т.е. иметь одинаковую сигнатуру), а производные классы обеспечивают для них свои собственные реализации. Базовый класс Shape (рис. 10.2, часть 1) состоит их четырех открытых виртуальных функций и не содержит каких-либо данных. Функции printShapeName и print являются чисто виртуальными, так как они переопределяются в каждом производном классе. Функции area и volume определены, причем по определению они возвращают 0.0. Эти функции переопределяются в тех производных классах, в которых требуется использовать их для соответствующих вычислений площади и объема. Класс Point (рис. 10.2, части 2 и 3) является производным от класса Shape с открытым наследованием. Точка не имеет ни площади, ни объема, так что функции-элементы базового класса area и volume в данном случае не переопределены; они наследуют их определения из базового класса Shape. Функции printShapeName и print являются реализациями виртуальных функций, которые были определены в базовом классе как чисто виртуальные. Другими функциями-элементами являются функция set, присваивающая новые значения координатам точки х и у, и функция get, возвращающая координаты X и у. Класс Circle (рис. 10.2, части 4 и 5) является производным от класса Point с открытым наследованием. Круг не имеет объема, так что функция-элемент базового класса volume для класса Circle не переопределяется; она наследуется из базового класса Shape (через класс Point). Круг имеет площадь; поэтому функция area в классе Circle переопределяется. Функции printShapeName и print являются реализациями виртуальных функций, которые были определены в базовом классе как чисто виртуальные. Если бы эти функции здесь не переопределялись, то наследовались бы версии этих функций из класса Point. Другими функциями-элементами являются функция set, присваивающая новое значение радиусу radius, и функция get, возвращающая значение радиуса. Класс Cylinder (рис. 10.2, части 6 и 7) является производным от класса Circle с открытым наследованием. Цилиндры имеют площадь и объем; поэтому в классе Cylinder обе функции area и volume переопределены. Функции printShapeName и print являются реализациями виртуальных функций, которые были определены в базовом классе как чисто виртуальные. Если бы эти функции здесь не переопределялись, то наследовались бы версии этих функций из класса Circle. Другими функциями-элементами являются функция set, присваивающая новое значение высоты цилиндра height, и функция get, возвращающая значение высоты. FIG10 2.CPP Драйвер иерархии точка, круг, #include <iostream.h> #include <iomanip.h> tinclude shape.h tinclude pointl.h tinclude circlel.h tinclude cylindrl.h цилиндр main ( ) ( Point pointC?, 11); Создается объект класса Point Circle circle(3.5, 22, 8); Создается объект класса Circle Cylinder cylinder(10, 3.3, 10, 10); Создается объект класса Cylinder point.printShapeName(); cout << point endl; circle.printShapeName ( ); cout circle <<endl; Статическое связывание Статическое связывание cylinder.printShapeName(); cout << cylinder \n\n Статическое связывание объекта производного объекта производного cout setiosflags(ios::showpoint) << setprecision(2); Shape *arrayOfShapes[3]; Масссив указателей базового класса Задание элементу arrayOfShapes[0] объекта производного класса Point Задание элементу arrayOfShapes[1] класса Circle Задание элементу arrayOfShapes[2] класса Cylinder arrayOfShapes[0] = Spoint; arrayOfShapes[1] = Scircle; arrayOfShapes[2] = &cylinder; Цикл no arrayOfShapes и печать имени формы, площади и объема каждого объекта, на который указывает элемент (используется динамическое связывание) for (int i = 0; i < 3; i++) ( arrayOfShapes[i]->printShapeName(); cout endl; arrayOfShapes[i]->print(); cout ХпПлощадь = arrayOfShapes[i]->area() ХпОбъем = arrayOfShapes[i]->volume() endl endl; return 0; Рис. 10.2. Драйвер для иерархии точка, круг, цилиндр (часть 8 из 9) Программа драйвер (рис. 10.2, части 8 и 9) начинает свою работу с создания объекта point класса Point, объекта circle класса Circle и объекта cylinder класса Cylinder. Для каждого объекта вызывается функция printShapeName и каждый объект выводится с помощью своей перегруженной операции поместить в поток, чтобы показать правильную инициализацию объектов. Затем объявляется массив arrayOfShapes типа Shape *. Этот массив указателей базового класса используется для того, чтобы указывать на каждый созданный объект производного класса. Сначала элементу массива аг-rayOfShapes[0] присваивается адрес объекта point, затем элементу arrayOf-Shapes[l] присваивается адрес объекта circle, а элементу arrayOfShapes[2] присваивается адрес объекта cylinder. После этого выполняется структура for, просматривающая массив arrayOfShapes и выполняющая на каждой итерации цикла следующие вызовы: arrayOfShapes[i]->printShapeName; arrayOfShapes[i]->print( ) arrayOfShapes[i]->area( ) arrayOfShapes[i]->volume( ) Каждый из приведенных выше вызовов активизирует эти функции для того объекта, на который указывает элемент массива arrayOfShapes[i]. Из выходных результатов, приведенных на рис. 10.2, часть 9, следует, что функции вызываются должным образом. Сначала выводится строка Точка: и координаты, хранящиеся в объекте point; площадь и объем равны 0.00. Затем выводится строка Круг: , координаты центра круга и радиус, хранящиеся в объекте circle; потом вычисляется площадь круга, а его объем равен 0.00. И, наконец, выводится строка Цилиндр , координаты центра, радиус и высота цилиндра, хранящиеся в объекте cylinder; потом вычисляются площадь его поверхности и объем. Все вызовы функций printShapeName, print, area и volume реализуются в процессе выполнения программы с помощью динамического связывания. Точка: [7, 11] Круг: [22, 8]; Радиус =3.50 Цилиндр: [10.00, 10.00]; Радиус = 3.30; Высота = 10.00 Точка: [7.00, 11.00] Площадь = О.00 Объем =0.00 Круг: [22.00, 8.00]; Радиус =3.50 Площадь = 38.48 Объем =0.00 Цилиндр: [10.00, 10.00]; Радиус = 3.30; Высота = 10.00 Площадь = 275.77 Ш Объем = 342.12 Рис. 10.2. Драйвер для иерархии точка, круг, цилиндр (часть 9 из 9)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |