类的派生和多态性的应用举例
例子:先建立一个Point类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。
#include<iostream>
using namespace std;
class Point
{
public:
Point(float x = 0, float y = 0);
void setPoint(float, float);
float getX() const { return x; }
float getY() const { return y; }
friend ostream & operator<<(ostream &, const Point &);
protected:
float x, y;
};
Point::Point(float a, float b)
{
x = a; y = b;
}
void Point::setPoint(float a, float b)
{
x = a; x = b;
}
ostream & operator<<(ostream &output, const Point &p)
{
output << "[" << p.x << "," << p.y << "]" << endl;
return output;
}
class Circle:public Point
{
public:
Circle(float x = 0, float y = 0, float r = 0);
void setRadius(float);
float getRadius() const;
float area() const;
friend ostream &operator<<(ostream &, const Circle &);
private:
float radius;
};
Circle::Circle(float a, float b, float r) :Point(a, b), radius(r)
{
}
void Circle::setRadius(float r)
{
radius = r;
}
float Circle::getRadius() const { return radius; }
float Circle::area() const
{
return 3.14159*radius*radius;
}
ostream &operator<<(ostream &output, const Circle &c)
{
output << "Center=[" << c.x << "," << c.y << "],r=" << c.radius
<< ",area=" << c.area() << endl;
return output;
}
class Cylinder :public Circle
{
public:
Cylinder(float x = 0, float y = 0, float r = 0, float h = 0);
void setHeight(float);
float getHeight() const;
float area() const;
float volume() const;
friend ostream& operator<<(ostream &, const Cylinder&);
protected:
float height;
};
Cylinder::Cylinder(float a, float b, float r, float h) :Circle(a, b, r), height(h){}
void Cylinder::setHeight(float h)
{
height = h;
}
float Cylinder::getHeight()const
{
return height;
}
float Cylinder::area()const
{
return 2 * Circle::area() + 2 * 3.14159*radius*height;
}
float Cylinder::volume()const
{
return Circle::area()*height;
}
ostream &operator <<(ostream &output, const Cylinder&cy)
{
output << "Center = [<< cy.x << , << cy.y << ], r = "<< cy.radius
<< ", h = "<< cy.height << "area = "<< cy.area() << ", volume = "
<< cy.volume() << endl;
return output;
}
int main()
{
Cylinder cy1(3.5, 6.4, 5.2, 10);
cout << "original cylinder : x = " << cy1.getX() << ", y = "<< cy1.getY() << ",r = "
<< cy1.getRadius() << ", h = "<< cy1.getHeight() << "area = "<< cy1.area()
<< ", volume = "<< cy1.volume() << endl;
cy1.setHeight(15);
cy1.setRadius(7.5);
cy1.setPoint(5, 5);
cout << "new cylinder : "<< cy1;
Point &pRef = cy1;
cout << "pRef as a Point : "<< pRef;
Circle &cRef = cy1;
cout << "cRef as a Circle : " << cRef;
system("pause");
return 0;
}