首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语 |
||
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平 驾驶员 | 网络编辑 |
||
卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 |
||
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
【考点六】虚函数与多态性
1、多态性的概念一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同的对象服务,这就是所谓多态性(polymorphism)。在C+ +语言中,多态性可分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模板体现的。利用函数重载机制,在调用同名的函数时,编译系统可根据实参的具体情况确定所调用的是同名函数中的哪一个。利用函数模板,编译系统可根据模板实参以及模板函数实参的具体情况确定所要调用的是哪个函数,并生成相应的函数实例;利用类模板,编译系统可根据模板实参的具体情况确定所要定义的是哪个类的对象,并生成相应的类实例。由于有关操作所针对的具体目标(函数或类)的确定都是在编译时完成的,与运行时的动态环境无关,"编译时的多态性"因此而得名,其实现机制则和为静态绑定(static binding,也译作静态联编)。函数重载是"函数"一章中已经学习过的内容,但其中没有包含函数重载的一种特殊情况:运算符重载。
2、虚函数在成员函数声明的前面加上virtual修饰,即把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不得是静态成员函数。在派生类中可以重新定义从基类继承下来的虚函数,从而提供该函数的适用于派生类的专门版本。也可能并不需要重新定义,在这种情况下,继承下来的虚函数仍然保持其在基类中的定义,即派生类和基类使用同一函数版本。除少数特殊情况外,在派生类中重定义虚函数时,函数名、形参表和返回值类型必须保持不变。虚函数在派生类被重定义后,重定义的函数仍然是一个虚函数,可以在其派生类中再次被重定义。注意,对于虚函数的重定义函数,无论是否用virtual修饰都是虚函数。当然,最好不要省略virtual修饰,以免削弱程序的可读性。对虚函数的调用有两种方式:非多态调用和多态调用。非多态调用是指不借助于指针或引用的直接调用。非多态调用总是通过成员访问运算符 .进行的。与通常的成员函数调用类似,非多态调用是建立在静态绑定机制的基础之上的,不具备多态性特征。多态调用是指借助于指向基类的指针或引用的调用。在C+ +中,一个基类指针(或引用)可以用于指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。基类中的实函数也可以在派生类中重定义,但重定义的函数仍然是实函数。在实函数的情况下,通过基类指针(或引用)所调用的只能是基类的那个函数版本,无法调用到派生类中的重定义函数。也就是说,尽管调用的语法形式可能是相同的,但对实函数的任何形式的调用都是非多态的。注意,无论是虚函数还是实函数,在派生类中被重定义后,原来的函数版本即被隐藏,在通过成员访问运算符 .直接调用该函数时,所调用的是重定义版本。但原来的版本依然存在,仍然可以通过在函数名前加域修饰(即:<类名>::)来调用它们。
3、虚析构函数析构函数也可以通过virtual修饰而声明为虚函数。虚析构函数与一般虚函数的不同之处在于:(1)重定义函数就是派生类的析构函数,不要求同名。(2)一个虚析构函数的版本被调用执行后,接着就要调用执行基类版本,依次类推,直到调用执行了派生序列的最开始的那个虚析构函数版本为止。通常,只要派生类中包含有虚函数的重定义(从而有可能被多态调用),而且对析函数进行了专门的声明(而不是不做任何声明,从而采用默认的析构函数),其基类的析构函数就应当声明为虚函数,否则就可能出问题。
4、纯虚函数与抽象类在某些情况下,基类无法确定(或无法完全确定)一个虚函数的具体操作方式或内容,只能靠派生类来提供各个具体的实现版本。基类中的这种必须靠派生类提供重定义版本的虚函数称为纯虚函数。为了将一个虚函数声明为纯虚函数,需要在虚函数原形的语句结束符 ;之前加上=0。拥有纯虚函数的类称为抽象类,抽象类不能用来定义对象。如果一抽象类的派生类没有重定义来自基类的某个纯虚函数,则该函数在派生类中仍然是纯虚函数,这就使得该派生类也成为抽象类。也就是说,一个派生类可以把重定义纯虚函数的任务进一步转交给它自己的派生类。可以在将一个函数声明为纯虚函数的同时,为该函数提供实现版本。换句话说,一个函数是否为纯虚函数,取决于其原形的尾部是否为"=0",与实现版本的有无没有什么关系。拥有实现版本的纯虚函数仍然有赖于派生类提供重定义版本。纯虚函数的实现版本通常是不完善的版本,但包含了一些共有操作,供各个派生类在重定义函数中调用。派生类在重定义一个纯虚函数时,可以继续将之声明为纯虚函数。另外,纯虚函数不得声明为内联函数。
希望与更多计算机等级考试的网友交流,请进入计算机等级考试论坛
更多信息请访问:考试吧计算机等级考试栏目
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |