c++ 纯虚函数+动态、静态关联

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值