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

1 ... 185 186 187 [ 188 ] 189 190 191 ... 342


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

POINT.СРР

Функции-элементы класса Point ttinclude <iostream.h> tinclude point.h

Конструктор класса Point Point::Point (float a, float b)

setPoint(a, b); }

Установка координат x и у в Poin void Point::setPoint(float a, float b) {

X = a; у = b;

Вывод данных Point (с помощью операции поместить в поток) ostream &operator (ostream soutput, const Point &p)

output [ р.х , р.у ];

return output; возможность сцепленных вызовов

Рис. 9.4. Определения функций-элементов класса Point (часть 2 из 5)

CIRCLE.Н

Определение класса Circle #ifndef CIRCLE H fdefine CIRCLE H

tinclude <iostream.h> #include <iomanip.h> #include point.h

class Circle : public Point { Circle наследует Point

friend ostream Soperator<<(ostream S, const Circle S); public:

конструктор с умолчанием

Circle(float r = 0.0, float x = 0, float у = 0);

void setRadius(float) ; float getRadiusO const; float areaO const; protected:

float radius;

#endif

установка радиуса возвращение радиуса вычисление площади



Установка радиуса круга ->id Circle: :setRadius (float г) { radius = г; }

Получение радиуса круга float Circle::getRadius() const { return radius; }

Вычисление площади круга oat Circle::area () const jj;, { return 3.14159 * radius * radius; } .2!

Вывод данных Circle в форме: I Центр = [x, у]; Радиус = #.##

ostream soperator (ostream soutput, const Circle Sc)

output Центр = [ << c.x , c.y

]; Радиус = << setiosflags(ios::showpoint) << setprecision (2) << c.radius; return output; возможность сцепленных вызовов

Рис. 9.4. Определение функций-элементов класса Circle (чааь 4 из 5)

Класс Circle (рис. 9.4, часть 3) наследует классу Point путем открытого наследования. Это указано в первой строке определения класса

class Circle : public Point { Circle наследует Point

Двоеточие в заголовке определения класса указывает наследование. Ключевое слово public указывает тип наследования (смотри раздел 9.7). Все элементы класса Point унаследованы в классе Circle. Это означает, что открытый интерфейс класса Circle включает открытые функции-элементы класса Point и добавляет свои функции-элементы area, setRadius и getRadius.

Конструктор Circle (рис. 9.4, часть 4) должен активизировать конструктор Point для задания начальных значений той части объекта Circle, которая относится к базовому классу. Это осуществляется списком инициализаторов элементов, рассмотренным в главе 7:

Circle::Circle(float г, float а, float b)

: Point (a, b) вызов конструктора базового класса

Вторая строка заголовка функции конструктора активизирует конструктор класса Point по имени. Значения а и b передаются из конструктора класса Circle конструктору класса Point, чтобы задать начальные значения элементам х и у базового класса. Если конструктор Circle не активизирует конструктор Point явно, то конструктор Point активизируется со значениями X и у по умолчанию (т.е. О и 0). Если класс Point не снабжен конструктором с умолчанием, компилятор генерирует сообщение об ошибке.

-..-.j: CIRCLE. СРР

II Определения функций-элементов класса Circle tinclude circle.h

Конструктор Circle вызывает конструктор Point Я lie инициализаторами элементов, затем инициализирует радиус.

Circle::Circle(float г, float а, float b) : Point (a, b) вызов конструктора базового класса

{ radius = г; }



FIG9 4.CPP

Приведение типов указателей базового класса к типам указателей производного класса #include <iostream.h> #include <iomanip.h> iinclude point.h iinclude circle.h

main ( ) {

Point *pointPtr, p(3.5, 5.3); Circle *circlePtr, c(2.7, 1.2, 8.9);

cout Point p: p endl Circle c: c endl;

Рассмотрение Circle как Point (видит только часть базового класса)

pointPtr = Sc; присваивание адреса Circle

указателю pointPtr cout endl Circle с (через *pointPtr): *pointPtr endl;

Рассмотрение Circle как Point (c помощью приведения типов)-pointPtr = sc; присваивание адреса Circle

указателю pointPtr circlePtr = (Circle *) pointPtr; приведение типов

базового к производному cout << endl << Circle с (через *circlePtr): << endl

<< *circlePtr endl Площадь с (через circlePtr): << circlePtr->area() <<endl;

ОПАСНОСТЬ: рассмотрение Point как Circle

pointPtr = Sp; присваивание адреса Point

указателю pointPtr circlePtr = (Circle *) pointPtr; приведение типов

базового к производному cout endl Point p (через *circlePtr): endl *circlePtr endl << Площадь объекта circlePtr указывает на: circlePtr->area () endl;

return 0; }

Point p: [3.5, 5.3]

Circle c: Центр = [1.2, 8.9]; Радиус =2.70

Circle с (через *pointPtr): [1.20, 8.90]

Circle с (через *circlePtr):

Центр = [1.20, 8.90]; Радиус =2.70

Площадь с (через circlePtr): 22.90

Point р (через *circlePtr):

Центр = [3.50, 5.30]; Радиус = 4.02в-38

Площадь объекта circlePtr указывает на: 0.00

Рис. 9.4. Приведение типов указателей базового класса к типам указателей производного

класса (часть 5 из 5)



1 ... 185 186 187 [ 188 ] 189 190 191 ... 342

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