【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
- 【c++】多态总结
- 【C++】多态总结
- C++——多态总结
- 黑马程序员_ Objective C 封装,继承,多态总结
- C总结
- C 总结
- 【C++】总结
- 【C#】总结
- C---------------------总结
- c总结
- C#--总结
- c 总结
- c总结
- C总结
- C 总结
- 【总结】C语言总结!!!
- 数据类型总结 (C++,C#)
- [C语言]C总结
- 简单的JavaWeb投票系统
- 给SwipeRefreshLayout添加上拉加载更多功能
- 高性能MySQL读书笔记:3、服务器性能剖析
- Message中自己new Message()和Message.obtain()的区别?
- 占小狼-Java进阶之路-浅谈StringBuffer
- 【c++】多态总结
- Android中把矩形图片切成圆形图片
- 学习C 的第七天
- Doge学HTML - 1
- springMVC源码分析--SimpleServletHandlerAdapter(二)
- 经典查询练手第三篇
- 《Effective Objective-C 2.0》读书笔记---第七章
- 安装eclipse
- windows下nodejs+express nginx的配置