近期在研究c++中多态的应用 ,当中遇到些许的疑问与问题,可是终于的结果是不容置疑的,以下记录下我的学习过程,以纪念本个知识点。
首先,是从一个案例開始的,题目大意是这种:
设定一个多边形的公共类,然后再设定多个图形的各个派生类,最后通过基类,依据多态的应用通过基类,求出所求图形的面积
于是依据自己所学的知识,開始大致的勾画原始的雏形例如以下:
#include using namespace std;
class Shape //基类 { public: virtual double area()=0; };
int main () { Circle c(5); //圆參数赋值 Rectangle r(3,4); //矩形參数赋值 Triangle t(3,4); //三角形赋值 Shape *p; //设置一个基类的指针 p=&c; //调用求圆面积的方法 求圆的面积 cout<<p->area()<<endl; p=&r; //调用求矩形面积的方法求矩形面积 cout<<p->area()<<endl; p=&t; //调用求三角形面积的方法求三角形的面积 cout<<p->area()<<endl; system("pause"); return 0; }
然后,再把一个一个的派生类,加入进去 ,效果例如以下:
#include using namespace std; class Shape { public: virtual double area() =0; };
class Circle: public Shape { public: Circle(double r):radius(r){} virtual double area() { return radius*radius*3.14159; } private: double radius; }; class Rectangle:public Shape { public: Rectangle(double x,double y):x(x),y(y){} virtual double area() { return x*y; } private: double x,y; }; class Triangle:public Shape { public: Triangle(double x,double y):x(x),y(y){} virtual double area() { return x*y/2; } private: double x,y; }; int main () { Circle c(1); Rectangle r(3,4); Triangle t(3,4); Shape *p; p=&c; cout<<p->area()<<endl; p=&r; cout<<p->area()<<endl; p=&t; cout<<p->area()<<endl; system("pause"); return 0; }
执行结果:
相同的道理,还能够这样子写,仅仅是每一个人的习惯不同而已,代码例如以下:
#include using namespace std; class shape { public: virtual void area()=0; }; class Trangle : public shape { protected: double a,b; public: Trangle(double a,double b):a(a),b(b){}; virtual void area() { cout<<a*b*0.5<<endl; } }; class Rectangle:public shape { protected: double a,b; public: Rectangle(double a,double b):a(a),b(b){}; virtual void area() { cout<<a*b<<endl; } }; class Circle:public shape { protected: double a; public: Circle(double a):a(a){}; virtual void area() { cout<<3.14*a*a<<endl; } }; int main() { shape *p; Trangle t(1,1); Rectangle r(1,1); Circle c(2); p=&t; // 三角形面积 p->area() ; p=&r; //矩形面积 p->area() ; p=&c; // 圆形面积 p->area(); return 0; }
当中须要注意的点是: 一定要写成的是公有的派生,即public 不然默认的都是私有的派生。还有在写代码的过程中,一定要注意不要把英语字母写错,当中的一个字母错了,花了我好长时间,最后才检查出来,敲代码的前期大都会遇到这种情况的,我们须要做的就是,认真再认真。