版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象编程中的多态性-季松华【基于c+ , java概念上基本完全一样,只是在实现上有些细微差别基本数据类型:整数、浮点数、字符等运算符:加减乘除等】目前,面向对象编程非常的流行,面向对象编程有三大特征,分别是 封装、继承和多态性本课堂主要讨论多态性什么是多态性?一:多态性定义多态性,按字面理解就是多种形状,比如有生物多态性,基因多态性等等计算机编程中的定义:相同的方法调用可实现不同的实现方式,简单点说就是“一个接口,多种方法”举一个例子,计算机硬件里面的输入输出设备,我们统称为I/O设备,而具体的设备实体 输入的有键盘、鼠标、扫描仪等等,输出的有显示器、打印机、音响等等,这个例子中的I/O
2、设备就是一个统一的接口,而键盘、显示器呢就是具体的实现,(堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。 针对不同的数据类型, 编程人员不必手工选择,只需使用统一接口名,系统可自动选择。)下面讨论多态性在我们编程中的表现形式二:多态性表现形式:主要有以下4中:强制多态、重载多态、类型参数化(模板)多态以及包含多态强制多态性:强制是指两种不同的数据类型进行转换的一种语义操作;程序设计语言中基本数据类型的大多数操作符,在发生不同类型的数据之间混合运算时,-般都会进行强制类型转换,以符合函数或操作符的要求,即隐式的转换程序员也可以显示的进行强制操作,
3、即显示的转换比如说整形与浮点型相加,3+3.14通过转换,实现了一个接口(某种数据类型)多种实现(多种数据类型)重载多态性:重载包括运算符重载和函数重载,编译系统根据参数类型及个数的最佳匹配,自动确定调用哪一个函数,就是函数重载,相应的,对于已有的运算符赋予多重含义,使得同一个运算符作用于不同的数据时,产生不同的行为,就是运算符重载运算符重载:有两种,一种是重载为类的成员函数,一种是重载为类的友元函数,面向对象编程中有一个很重要的概念,类,类的实例就是对象,在进行对象与基本数据类型它们之运算的时候,常常需要进行操作符重载,为什么?基本数据类型都是已经定义好的,间的运算都是可以预知的,比如一个整
4、数与浮点数相加3+3.14 ,结果可不可以预知?可以的,系统能知道应该产生什么样的结果6.14吧而一个对象与对象相加或者一个对象与一个基本数据类型相加,系统能知道应该产生什么样的结果吗?比如“人”这样一个对象与整数 3相加,你能知道是年龄加 3呢还是身高加3?不知道的,所以要进行运算符重载,那么你可以重载为年龄加3而不是身高加3通过这种方法,就为“加法运算”这一种接口符实现了不同的行为函数重载:允许功能相近的的函数在相同的作用域内同名定义,这样就比较方便记忆, 便于使用,程序设计也就更加灵活函数重载,就是同名函数,函数名字相同,参数类型不同或者个数不同或者两者都不同C语言中没有函数重载这个概念
5、,c+/java中有,举一个例子,实现加法运算的函数,取名为sum,带两个参数可以是两个整形,浮点型,字符串这就是多态性的表现,一种接口,多种方法类型参数化多态:有模板函数,模板类;当一个函数(类)统一的对若干类型参数操作,这 些类型又表现出某些公共的语义特性时,就可以用模版函数或模板类来描述。这就是参数类型多态。模板函数、模版类的定义方法参考相关的书籍,本处不再赘述。【模版函数Template T add ( T a, T b )Return a+b;)模板类Template Class A T j;Public:A(T a) j = a; );卜模板技术的多态性是最好理解的,也称为最纯的多
6、态一个模板就是一个接口,通过对模板的演化,就可以产生许许多多的具体的实现方法需要注意的是:在类型参数化多态中,一个多态函数(类)必须至少带一个类型参数,该类型参数确定函数(类)在每次执行时操作数的类型,包含多态:基础是继承和虚函数, 也是常说的面向对象编程中的的多态技术,虚函数是引入了派生概念后,用来表现基类和派生类的成员函数之间的一种关系的,其为C+语言提供了灵活的多态实现机制,虚函数在基类中定义,需要定义为虚函数的成员函数在其声明中加上关键字virtual,举一个例子 父类 汽车,有一个接口方法:驾驶,派生类 卡车,小轿车,分别实现了各自的驾驶方法好,现在,定义一个父类汽车的指针 (或引用
7、),当该指针(或引用)对应于卡车时,驾驶表现的是卡车的驾驶技术,当该指针(或引用)对应于小轿车时,驾驶表现的是小轿车的驾驶技术,大家知道,小轿车是拿的是 c照,卡车可能就是 A照了,对于驾驶技术的要求是不同的,即一个接口,多种方法多态性刚才,讨论了多态性的表现形式,下面谈一下多态性的实现细节三:多态性的实现细节:分为两种:静态绑定技术:在生成可执行代码之前, 在编译程序时,由编译器决定使用某种具体的实现,比如强制、重载、类型参数化,强制:类型转换在编译时就已经完成重载:函数名在调用时相同, 在底层是不同的,编译时会根据参数的不同重新生成不同的函数名类型参数化:模版不能直接使用,需要进行演化,就
8、是生成各种具体的函数或类,都属于这一种技术,也称为静态多态动态绑定技术:运行时决定,也称为动态多态比如前面所说的包含多态就是这种动态多态如何实现?当我们实例化对象的时候会,系统会为该对象分配内存, 含有虚函数的对象的内存会比不含有虚函数的对象多 4个字节,即一个指针 的大小,该指针被称为 虚指针【每个含有虚函数的类,实例化对象时,内存中会额外分配4个字节,保存一个虚指针(vptr),该虚指针指向一张虚函数表(vtbl),表中每一项是一个虚函数的地址,也就是说,虚函数表的每一项是一个虚函数的指针。没有虚函数的C+类,是不会有虚函数表的。两张图:Chssl构件寅腑仃3b上a*!t;unc);.:二
9、二工:vfunci I); :一!- vfunc2 (); v i 11 l vfunc3();A Cktssl二vfUnelOA Classi: Ali.mc 20A Class 30C la5sl nieiiifimcO-1)0/vfbiKZX)Clais2,忤俄的比如,父类汽车的指针(或引用),运行时获得小轿车对象内存,当调用方法驾驶时,就会通过小轿车的虚指针找到小轿车对应的虚函数表,然后在表里查找驾驶这个方法,并调用该方法,于是,表现出来就是小轿车的驾驶可以看出,真正跟面向对象编程有密切联系的多态性是包含多态四:总结: 通过前面的分析,可以看到,进行抽象(类型转换,重载等程序员在编写代码的时候,往往需要对一些具有共性的东西,等,只是层次不一样),使之变成一个统一的接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业劳动合同管理策略
- 教育机构整体租赁合同模板
- 家具生产厂租赁合同模板
- 通风空调工程合同样本
- 家电设计师合作协议范本
- 私募基金仲裁补充协议书
- 办公室助理聘用合同范例
- 建筑施工合同模板:公共交通工程
- 农药生产企业劳动合同模板
- 体育赛事招投标廉洁协议样本
- 结构化学(PDF电子书)
- 标准夫妻婚内协议书模板
- 人教版三年级上册道德与法治全册知识点 (复习资料)
- 高中英语新外研版必修1单词英译汉
- 膜结构车棚施工方案模板
- 商业银行中小企业信贷风险管理研究-以华夏银行为例
- 2024年出版出版专业基础知识试题初级答案
- DB15-T 3600-2024 黑土地质量等级划分技术规范
- 人防民防知识宣传手册
- DL∕T 5767-2018 电网技术改造工程工程量清单计价规范
- 国有企业股权转让协议(2024版)
评论
0/150
提交评论