|
Программирование >> Структурное программирование
Заметим, что перегруженная функция-операция поместить в поток (рис. 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)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |