例12.1 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。
对于一个比较大的程序,应当分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。
(1) 声明基类Point类
可写出声明基类Point的部分如下:
#include <iostream>
//声明类Point
class Point
{ public:
Point(float x=0,float y=0);//有默认参数的构造函数
void setPoint(float,float); //设置坐标值
float getX( ) const { return x;} //读x坐标
float getY( ) const { return y;} //读y坐标
friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<”
protected: //受保护成员
float x,y;
};
//下面定义Point类的成员函数
//Point的构造函数
Point::Point(float a,float b) //对x,y初始化
{x=a;y=b;}
//设置x和y的坐标值
void Point::setPoint(float a,float b) //为x,y赋新值
{x=a;y=b;}
//重载运算符“<<”,使之能输出点的坐标
ostream & operator<<(ostream &output,const Point &p)
{output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
以上完成了基类Point类的声明。
现在要对上面写的基类声明进行调试,检查它是否有错,为此要写出main函数。实际上它是一个测试程序。
int main( )
{Point p(3.5,6.4);//建立Point类对象p
cout<<"x="<<p.getX( )<<",y="<<p.getY( )<<endl;//输出p的坐标值
p.setPoint(8.5,6.8); //重新设置p的坐标值
cout<<"p(new):"<<p<<endl; //用重载运算符“<<”输出p点坐标
}
程序编译通过,运行结果为
x=3.5,y=6.4
p(new):[8.5,6.8]
测试程序检查了基类中各函数的功能,以及运算符重载的作用,证明程序是正确的。
(2) 声明派生类Circle
在上面的基础上,再写出声明派生类Circle的部分:
class Circle:public Point//circle是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;}
//计算圆面积