虚函数与抽象基类的应用

#include <iostream>
using namespace std;
//声明抽象基类Shape
class Shape
{
public:
	virtual float area() const {return 0.0;}//虚函数
	virtual float volume() const {return 0.0;}//虚函数
	virtual void shapeName() const = 0;//纯虚函数
};
//声明Point类
class Point:public Shape//Point是Shape的公用派生类
{
public:
	Point(float = 0,float =0);//声明构造函数
	void setPoint(float,float);
	float getX() const {return x;}//设定点的x坐标
	float getY() const {return y;}//设定点的y坐标
	virtual void shapeName() const {cout<<"Point:";}//对虚函数进行再定义
	friend ostream & operator << (ostream &, const Point &);//运算符重载
protected:
	float x,y;
};
//定义Point类成员函数
Point::Point(float a,float b)
{
	x = a; y = b;//定义构造函数
}
void Point::setPoint(float a,float b)
{
	x = a; y = b;
}
ostream & operator << (ostream &output,const Point &p)
{
	output<<"["<<p.x<<","<<p.y<<"]";
	return output;
}

//声明Circle类
class Circle:public Point
{
public:
	Circle(float x=0,float y=0,float r=0);//声明构造函数
	void setRadius(float);//设定半径
	float getRadius() const;//取半径的值
	virtual float area() const;//对虚函数进行再定义
	virtual void shapeName() const{cout<<"Circle:";}//对虚函数进行再定义
	friend ostream &operator <<(ostream &,const Circle &);//运算符重载
protected:
	float radius;
};
//声明Circle类成员函数
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<<"["<<c.x<<","<<c.y<<"],r = "<<c.radius;
	return output;
}

//声明Cylinder类
class Cylinder:public Circle
{
public:
	Cylinder(float x=0,float y=0, float r=0,float h=0);//声明构造函数
	void setHeight(float);//设定圆柱高
	virtual float area() const;//重载虚函数
	virtual float volume() const;//重载虚函数
	virtual void shapeName() const{cout<<"Cylinder:";}//重载虚函数
	friend ostream &operator <<(ostream &,const Cylinder &);//运算符重载
protected:
	float height;
};
//定义Cylinder类成员函数
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::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<<"["<<cy.x<<","<<cy.y<<"],r = "<<cy.radius<<",h ="<<cy.height;
	return output;
}

//main函数
int main()
{
	Point point(3.2,4.5);
	Circle circle(2.4,1.2,5.6);
	Cylinder cylinder(3.5,6.4,5.2,10.5);
	point.shapeName();//用对象名建立静态关联
	cout<<point<<endl;//输出点的数据

	circle.shapeName();
	cout<<circle<<endl;

	cylinder.shapeName();
	cout<<cylinder<<endl<<endl;

	Shape *pt;//定义基类指针

	pt = &point;//使指针指向Point类对象
	pt->shapeName();//用指针建立动态关联
	cout<<"x = "<<point.getX()<<",y = "<<point.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";//输出点的数据

	pt = &circle;
	pt->shapeName();
	cout<<"x = "<<circle.getX()<<",y = "<<circle.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";

	pt = &cylinder;
	pt->shapeName();
	cout<<"x = "<<cylinder.getX()<<",y = "<<cylinder.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";
	
	system("pause");
	return 0;
}#include <iostream>
using namespace std;
//声明抽象基类Shape
class Shape
{
public:
	virtual float area() const {return 0.0;}//虚函数
	virtual float volume() const {return 0.0;}//虚函数
	virtual void shapeName() const = 0;//纯虚函数
};
//声明Point类
class Point:public Shape//Point是Shape的公用派生类
{
public:
	Point(float = 0,float =0);//声明构造函数
	void setPoint(float,float);
	float getX() const {return x;}//设定点的x坐标
	float getY() const {return y;}//设定点的y坐标
	virtual void shapeName() const {cout<<"Point:";}//对虚函数进行再定义
	friend ostream & operator << (ostream &, const Point &);//运算符重载
protected:
	float x,y;
};
//定义Point类成员函数
Point::Point(float a,float b)
{
	x = a; y = b;//定义构造函数
}
void Point::setPoint(float a,float b)
{
	x = a; y = b;
}
ostream & operator << (ostream &output,const Point &p)
{
	output<<"["<<p.x<<","<<p.y<<"]";
	return output;
}

//声明Circle类
class Circle:public Point
{
public:
	Circle(float x=0,float y=0,float r=0);//声明构造函数
	void setRadius(float);//设定半径
	float getRadius() const;//取半径的值
	virtual float area() const;//对虚函数进行再定义
	virtual void shapeName() const{cout<<"Circle:";}//对虚函数进行再定义
	friend ostream &operator <<(ostream &,const Circle &);//运算符重载
protected:
	float radius;
};
//声明Circle类成员函数
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<<"["<<c.x<<","<<c.y<<"],r = "<<c.radius;
	return output;
}

//声明Cylinder类
class Cylinder:public Circle
{
public:
	Cylinder(float x=0,float y=0, float r=0,float h=0);//声明构造函数
	void setHeight(float);//设定圆柱高
	virtual float area() const;//重载虚函数
	virtual float volume() const;//重载虚函数
	virtual void shapeName() const{cout<<"Cylinder:";}//重载虚函数
	friend ostream &operator <<(ostream &,const Cylinder &);//运算符重载
protected:
	float height;
};
//定义Cylinder类成员函数
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::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<<"["<<cy.x<<","<<cy.y<<"],r = "<<cy.radius<<",h ="<<cy.height;
	return output;
}

//main函数
int main()
{
	Point point(3.2,4.5);
	Circle circle(2.4,1.2,5.6);
	Cylinder cylinder(3.5,6.4,5.2,10.5);
	point.shapeName();//用对象名建立静态关联
	cout<<point<<endl;//输出点的数据

	circle.shapeName();
	cout<<circle<<endl;

	cylinder.shapeName();
	cout<<cylinder<<endl<<endl;

	Shape *pt;//定义基类指针

	pt = &point;//使指针指向Point类对象
	pt->shapeName();//用指针建立动态关联
	cout<<"x = "<<point.getX()<<",y = "<<point.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";//输出点的数据

	pt = &circle;
	pt->shapeName();
	cout<<"x = "<<circle.getX()<<",y = "<<circle.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";

	pt = &cylinder;
	pt->shapeName();
	cout<<"x = "<<cylinder.getX()<<",y = "<<cylinder.getY()<<"\narea = "<<pt->area()<<"\nvolume = "<<pt->volume()<<"\n\n";
	
	system("pause");
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值