漫漫编程路——C++篇(八)——关于虚函数和多态性 (一)

这次的内容对于C++来说是很重要的,虚函数和多态性是C++从一个基于对象的语言一下子变成了面向对象的语言,很神奇,有时候真的得好好感叹一下,人为什么这么聪明啊 不过需要注意的是为了实现多态,C++语言机制是以放弃一定的性能为代价的,不过管他呢,看看人家JAVA,再看看C++,在性能方面还是有一定优势的,而在付出某些代价后所得到的,也是非常值得的,它使C++更加便利更加易于理解和使用。 例题: 编写程序,计算圆形、三角形、正方形和长方形四种图形的面积。提示:可以定义一个抽象类Shape,在其中说明一个纯虚函数area()作为一个接口,用来求面积。由抽象类Shape派生出圆形、三角形、正方形和长方形4个派生类,在各个派生类中分别实现求各个图形的面积。 程序: shape.h class shape{ protected: double xcoord,ycoord; public:     shape(double x,double y):xcoord(x),ycoord(y){}     virtual double area()const=0; }; class circle:public shape{ protected:     double radius; public:     circle(double x,double y,double r):shape(x,y),radius(r){}     double area()const{     return 3.14*radius*radius;     } }; class triangle:public shape{ double x1,x2,y1,y2; public:     triangle(double x,double y,double a,double b,double c,double d):shape(x,y),x1(a),y1(b),x2(c),y2(d){}     double area()const; }; class square:public shape{ double border; public:     square(double x,double y,double b):shape(x,y),border(b){}     double area()const{     return border*border;     } }; class rectangle:public shape{ double xcoord1,ycoord1; public:     rectangle(double x,double y,double x1,double y1):shape(x,y),xcoord1(x1),ycoord1(y1){}     double area()const{     return (xcoord1-xcoord)*(ycoord1-ycoord);     } }; void f1(); void f2(); void f3(); void f4(); void f5(); function.cpp #include"shape.h" #include<iostream> #include<cmath> using namespace std; double triangle::area()const{ double k,m,h,he; k=(y2-y1)/(x2-x1); m=-k*x1+y1; h=abs(k*xcoord-ycoord+m)/sqrt(k*k+1); he=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return h*he/2; } double display(shape& s){     return s.area(); } void f1(){     double x,y,r;     cout<<"请输入圆的位置:";     cin>>x>>y;     cout<<"请输入圆的半径:";     cin>>r;     circle m(x,y,r);     cout<<"圆的面积为:"<<display(m)<<endl; } void f2(){ double x,y,x1,y1,x2,y2; cout<<"请输入三角形的位置:"; cin>>x>>y; cout<<"请输入三角形另外两个顶点坐标:"; cin>>x1>>y1>>x2>>y2; triangle m(x,y,x1,y1,x2,y2); cout<<"三角形的面积为:"<<display(m)<<endl; } void f3(){     double x,y,b; cout<<"请输入正方形的位置:"; cin>>x>>y; cout<<"请输入正方形的边:"; cin>>b; square m(x,y,b); cout<<"正方形的面积为:"<<display(m)<<endl; } void f4(){     double x,y,x1,y1; cout<<"请输入长方形的位置:"; cin>>x>>y; cout<<"请输入长方形的右下角的坐标:"; cin>>x1>>y1; rectangle m(x,y,x1,y1); cout<<"长方形的面积为:"<<display(m)<<endl; } void f5(){ cout<<"对不起,您的输入有误!"; } Shape.cpp #include"shape.h" #include<iostream> using namespace std; typedef void (*M)(); void main(){     M f[5]={f1,f2,f3,f4,f5}; int choice; while(1){     cout<<"/t***菜单***"<<endl;     cout<<"1、计算圆形面积"<<endl;     cout<<"2、计算三角形面积"<<endl;     cout<<"3、计算正方形面积"<<endl;     cout<<"4、计算长方形面积"<<endl;     cout<<"5、退出"<<endl;     cout<<"请选择······";     cin>>choice; switch(choice){     case 1:f[0]();break;     case 2:f[1]();break;     case 3:f[2]();break;     case 4:f[3]();break;     case 5:exit(0); default:f[4]();break; } } } 解析:为了方便阅读,我已经把程序分成头文件,函数实现文件和主函数文件,这也是为了以后写程序而养成的好习惯 这个程序在实现多态的基础上,我又加了函数指针的使用,使得主函数变得更加简单,而又不影响解读,并且使得各个功能更加分离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值