【c++】多态总结

来源:互联网 发布:springmvc 项目源码 编辑:程序博客网 时间:2024/04/30 10:23

什么是多态?

多态是指相同对象收到不同消息,或不同对象收到相同消息时产生不同的动作。


多态的分类:

1、静态多态【早绑定】

指相同对象收到不同消息时产生不同的动作。比如说,函数重载,计算两个数的和的函数Add,可以是Add(int a,  int b)计算两个整型的和,  也可以重载为Add(double a,  double b),这里函数Add就是相同的对象,而参数就是发出不同的消息,最终计算的和int类型的结果是int类型,double类型的结果是double类型。

2、动态多态【晚绑定】

指不同对象收到相同消息时产生不同的动作。是以封装和继承为基础,在类中引入虚函数,来实现动态多态。


代码举例:

1.静态多态

int Add(int a, int b){return a + b;}double Add(double a, double b){return a + b;}int main(){/* 静态多态:相同对象收到不同消息时产生不同的动作 */// 相同Add的函数   收到不同的参数cout << "int + int " <<  Add(1, 2) << endl;cout << "double + double " << Add(1.1, 2.2) << endl;// 不同的消息   输出不同的结果 return 0;}
打印结果:

int + int 3
double + double 3.3


2.动态多态

只有封装和继承时,构不成多态。多态是在封装和继承的基础上,引入虚函数,可以让子类重写父类中的函数。

没有虚函数时:

//  基类class Shape{public:void CalcArea(){cout << "Shape :: ClacArea()" << endl;}};// 矩形类class Rectangle : public Shape{public:void CalcArea(){cout << "Rectangle :: ClacArea()" << endl;}};// 三角形类 class Triangle : public Shape{public:void CalcArea(){cout << "Triangle :: ClacArea()" << endl;}};int main(){Rectangle rectangle;Triangle triangle;Shape* p;// 用父类指针指向子类, 去调用 子类的方法p = &rectangle;p->CalcArea();p = ▵p->CalcArea();return 0;}

打印结果:


此时不同对象调用的都是基类里的函数。


加入虚函数时构成多态。

//  基类class Shape{public:virtual void CalcArea(){cout << "Shape :: ClacArea()" << endl;}};// 矩形类class Rectangle : public Shape{public:virtual void CalcArea(){cout << "Rectangle :: ClacArea()" << endl;}};// 三角形类 class Triangle : public Shape{public:virtual void CalcArea(){cout << "Triangle :: ClacArea()" << endl;}};int main(){// 动态多态:不同的对象收到相同的消息产生不同的结果// 不同子类对象 rectangle  triangle  收到相同消息  CalcArea 产生不同的结果Rectangle rectangle;Triangle triangle;Shape* p;// 用父类指针指向子类, 去调用 子类的方法p = &rectangle;p->CalcArea();p = ▵p->CalcArea();return 0;}

打印结果:


0 0
原创粉丝点击