|
Программирование >> Структурное программирование
II FIG9 9.CPP Драйвер класса Circle #include <iostream.h> tinclude <iomanip.h> tinclude point2.h tinclude circle2.h main() { Circle c(2.5, 3.7, 4.3); cout Координата X равна c.getX() endl Координата Y равна с.getYO endl Радиус равен с.getRadius(); с.setRadius(4.25); с.setPoint(2, 2); cout << setiosflags(ios::fixed ios::showpoint); cout << endl << endl << Новые координаты точки и радиус равны endl с endl Площадь: с.агеаО endl; Point SpRef = с; cout endl << Печать Circle как Point: I pRef endl; * return 0; Координата X равна 3.7 Координата Y равна 4.3 Радиус равен 2.5 Новые координаты точки и радиус равны Центр = [2.000000, 2.000000]; Радиус = .25 Площадь: 56.74 Печать Circle как Point: [2.00, 2.00) Рис. 9.9. Драйвер класса Circle (часть 3 из 3) Заметим также, что на переменные х, у и radius необходимо ссылаться через объект: с.х, су и cradius. Это вызвано тем, что перегруженная операция поместить в поток не является функцией-элементом класса Cylinder. Программа драйвер создает объект класса Cylinder, затем использует функции доступа для получения информации об объекте Cylinder. Как и раньше, main не является ни функцией-элементом, ни другом класса Cylinder, так что она не может непосредственно ссылаться на защищенные данные класса Cylinder. Затем программа драйвер использует функции установки setHight, setRadius и setPoint для переустановки высоты, радиуса и координат цилиндра. В заключение драйвер задает начальное значение переменной ссылке pRef типа ссылка на объект Point (Point &), указывающее на объект су1 класса Cylinder. Драйвер печатает pRef, который, несмотря на то, что он инициализирован объектом класса Cylinder, думает , что это объект Point, так что на самом деле объект класса Cylinder печатается как объект класса Point. Затем драйвер задает начальное значение переменной ссылке cRef типа 9.15. Множественное наследование До сих пор в этой главе мы обсуждали простое наследование, когда каждый класс порождается только от одного базового класса. Однако, класс может порождаться более, чем от одного базового класса; такое порождение называется множественным наследованием. Множественное наследование означает, что производный класс наследует элементы нескольких базовых классов. Эта мощная возможность способствует интересным формам повторного использования кодов, но может вызвать и многообразные проблемы, связанные с некоторой неопределенностью. ссылка на объект Circle* (Circle &), указывающее на объект су1 класса Cylinder. Драйвер печатает cRef, который, несмотря на то, что он инициализирован объектом класса Cylinder, думает , что это объект класса Circle, так что объект класса Cylinder печатается как объект класса Circle. Выводится также площадь объекта класса Circle. Этот пример наглядно демонстрирует открытое наследование, определения и ссылки на защищенные данные-элементы. Теперь читатель должен чувствовать себя уверенно в вопросах наследования. В следующей главе мы покажем, как в общем случае программировать с помощью иерархического наследования, используя полиморфизм. Абстрагирование данных, наследование и полиморфизм - это суть объектно-ориентированного программирования. sD. ! CYLINDR2.H йи Определение класса Cylinder ttifndef CYLINDR2 H fdefine CYLINDR2 H iclude circle2.h (. jss Cylinder : public Circle { friend ostreamS operator<<(ostreamS, const Cylinders); public: конструктор с умолчанием Cylinder (float h = 0.0, float r = 0.0, float X = 0.0, float у = 0.0); Л. void setHeight (float) ; установка высоты float getHeightO const; возвращение высоты float areaO const; вычисление и возвращение площади float volume() const; вычисление и возвращение объема protected: float height; высота цилиндра #endif Рис. 9.10. Определение класса Cylinder (часть 1 из 3) Хороший стиль программирования 9.1 Множественное наследование является мощной возможноаью при правильном использовании. Множеавенное наследование должно использоваться, когда между новым типом и двумя или более существующими типами имеется отношение является (т.е. тип А является типом В и является типом С). CYLINDR2.CPP Определения элементов и дружественных функций класса Cylinder. #include <iostream.h> ttinclude <iomanip.h> tinclude cylindr2.h Конструктор Cylinder вызывает конструктор Circle Cylinder::Cylinder(float h, float r, float x, float y) : Circle(r, x, y) вызов конструктора базового класса { height = h; } Щ Установка высоты цилиндра void Cylinder::setHeight(float h) { height = h; } SB I Получение высоты цилиндра ЩЗ float Cylinder::getHeightО const { return height; } Щ II Вычисление площади цилиндра (т.е площади его поверхности) float Cylinder::area() const { return 2 * Circle::area() + Ц 2 * 3.14159 * radius * height; Вычисление объема цилиндра I float Cylinder::volume() const { return Circle::area() * height; } Вывод размеров цилиндра tsfiifX ostreams operator<< (ostream Soutput, const Cylinders c) output Центр = [ <<c.x , c.y ]; Радиус -= setiosflags(ios::showpoint) << setprecision (2) << cradius ; Высота = с.height;. return output; возможность сцепленных вызовов Рис. 9.10. Определения элементов и дружественных функций класса Cylinder (часть 2 из 3)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |