Программирование >>  Структурное программирование 

1 ... 205 206 207 [ 208 ] 209 210 211 ... 342


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

Базовый класс 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)



1 ... 205 206 207 [ 208 ] 209 210 211 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика