07 наследование 1
.pdf07 – 11
int getX() { return x; } int getY() { return y; }
};
Point::Point(int a, int b) { setPoint(a, b); }
void Point::setPoint(int a, int b) { x = a; y = b; }
07 – 12
// Перегруженная операция вывода в поток ОБК
ostream &operator << (ostream &output, Point &p)
{
output |
<< ’[’ |
<< p.x << ”, ” |
return |
<< p.y << ’]’; |
|
output; |
// разрешает сцепление |
}
07 – 13
//ПК; представляет круг с центром
//в точке (x,y) и радиусом radius
class Circle: public Point { friend ostream &operator <<
(ostream &, Circle &); protected:
float radius; public:
Circle(float=0.0, int=0, int=0); void setRadius(float);
07 – 14
float getRadius();
float area(); // возвращает площадь
};
//Конструктор ПК; вызывает конструктор БК
//через инициализатор элемента, а затем
//инициализирует радиус
Circle::Circle(float r, int a, int b): Point(a, b)
{ setRadius(r); }
07 – 15
void Circle::setRadius(float r) { radius = (r>=0 ? r:0); }
float Circle::getRadius() { return radius; }
float Circle::area()
{
return 3.14 * radius * radius;
}
07 – 16
// Перегруженная операция вывода в поток ОПК
ostream &operator << (ostream &output, Circle &c)
{
output << ”Центр = [”
<<c.x << ”, ” << c.y
<<”]; Радиус = ”
<<c.radius;
return output;
}
07 – 17
int main()
{
Point *pointPtr=0, p(30,50); Circle *circlePtr=0, c(2.7,120,89);
//ОБК обрабатывается как ОБК через имя
//объекта
cout << ”ОБК как ОБК: ” << p << endl;
07 – 18
//ОПК обрабатывается как ОПК через имя
//объекта
cout << ”ОПК как ОПК: ”
<< c << endl << endl;
07 – 19
//ОПК обрабатывается как ОБК через УБК,
//не преобразованный в УПК; в ОПК видны
//только унаследованные элементы
pointPtr = &c;
cout << ”ОПК как ОБК через УБК, ”
<<”не преобразованный в УПК:”
<<endl << *pointPtr
<<endl << endl;
07 – 20
//ОПК обрабатывается как ОПК через УБК,
//преобразованный в УПК; в ОПК видны
//все элементы
circlePtr = (Circle *) pointPtr;
cout << ”ОПК как ОПК через УБК, ”
<<”преобразованный в УПК:”
<<endl << *circlePtr
<<endl << ”Площадь: ”
<<circlePtr -> area()
<<endl << endl;