#include<iostream>
using namespace std;
class Shape
{
public:
virtual double area() const{return 0.0;} //虚函数 面积
virtual double volume() const{return 0.0;} //虚函数 体积
virtual void shape_name() const=0; //纯虚函数 形状名
};
class Point: public Shape
{
public:
Point(double x=0,double y=0); //构造函数 初始化
void set_point(double,double); //设置坐标
double getx() const {return x;}; //读取坐标X
double gety() const {return y;}; //读取坐标Y
virtual void shape_name() const {cout<<"Point";} //输出形状名
friend ostream & operator<<(ostream &,const Point &); //流重定义 输出坐标
protected:
double x,y;
};
Point::Point(double a,double b)
{x=a;y=b;}
void Point::set_point(double a,double b)
{x=a;y=b;}
ostream & operator<<(ostream &output,const Point &p) //流重定义 输出坐标
{
output<<"["<<p.x<<","<<p.y<<"]";
return output;
}
class Circle: public Point
{
public:
Circle(double x=0,double y=0,double r=0); //构造函数 初始化
void set_radius(double); //设置直径
double get_radius() const {return radius;}; //读取直径r
virtual double area() const{return 3.14159*radius*radius;} //输出面积
virtual void shape_name() const {cout<<"Circle";} //输出形状名
friend ostream & operator<<(ostream &,const Circle &); //流重定义 输出坐标
protected:
double radius;
};
Circle::Circle(double x,double y,double r):Point(x,y),radius(r){}
void Circle::set_radius(double r)
{radius=r;}
ostream & operator<<(ostream &output,const Circle &c) //流重定义 输出坐标
{
output<<"["<<c.x<<","<<c.y<<"],Radius="<<c.radius;
return output;
}
class Cylinder: public Circle
{
public:
Cylinder(double x=0,double y=0,double r=0,double h=0); //构造函数 初始化
void set_height(double); //设置高度
double get_height() const {return height;}; //读取高度h
virtual double area() const; //输出表面积
virtual double volume() const; //输出体积
virtual void shape_name() const {cout<<"Cylinder";} //输出形状名
friend ostream & operator<<(ostream &,const Cylinder &); //流重定义 输出坐标
protected:
double height;
};
Cylinder::Cylinder(double x,double y,double r,double h):Circle(x,y,r),height(h){}
void Cylinder::set_height(double h)
{
height=h;
}
double Cylinder::area() const
{
return 2*Circle::area()+2*3.14159*radius*height;
}
double Cylinder::volume() const
{
return Circle::area()*height;
}
ostream & operator<<(ostream &output,const Cylinder &cy) //流重定义 输出坐标
{
output<<"["<<cy.x<<","<<cy.y<<"],Radius="<<cy.radius<<",Height="<<cy.height;
return output;
}
int main()
{
Point point(3.2,4.5); //建立3个类
Circle circle(2.4,1.2,5.6);
Cylinder cylinder(3.5,6.4,5.2,10.5);
point.shape_name(); //静态关联
cout<<point<<endl;
circle.shape_name(); //静态关联
cout<<circle<<endl;
cylinder.shape_name(); //静态关联
cout<<cylinder<<endl;
Shape *pt;
pt = &point; //指向point
pt->shape_name(); //动态关联
cout<<": x="<<point.getx()<<",y="<<point.gety()<<",area="<<pt->area()<<",volum="<<pt->volume()<<endl;
pt = &circle; //指向circle
pt->shape_name(); //动态关联
cout<<": x="<<circle.getx()<<",y="<<circle.gety()<<",area="<<pt->area()<<",volum="<<pt->volume()<<endl;
pt = &cylinder; //指向cylinder
pt->shape_name(); //动态关联
cout<<": x="<<cylinder.getx()<<",y="<<cylinder.gety()<<",area="<<pt->area()<<",volum="<<pt->volume()<<endl;
return 0;
}