13.多态性与虚函数.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多态性和虚函数 本章要点 通过本章的学习,使读者: ? 掌握虚拟函数的声明、定义方法和访问属性 ? 理解纯虚函数和抽象类的概念,掌握纯虚函数和抽象类的定义方法 1 静态联编和动态联编 在C++中,多态性主要是通过函数名重载实现的。 重载函数是指程序中对同名函数进行调用时,编译器会根据函数参数的类型和个数,决定该调用哪一段函数代码来处理这个函数调用。 这种把函数调用与适当的函数代码相对应的动作称为联编。 联编分为静态联编和动态联编。 在编译阶段决定执行哪个同名函数被调用,这称为静态联编; 而在编译阶段不能决定执行哪个同名函数被调用,只有在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,称为动态联编。 多态性也分为静态和动态两种。 【例1】以下是一个静态联编的例子,分析程序的执行结果。 #include iostream.h class point { int x,y; public: point( int x1,int y1) { x=x1;y=y1; } int area( ) { cout点的面积为:; return 0; } }; class Rect: public point { int l,w; public: Rect( int x1,int y1,int l1,int w1): point (x1,y1) { l=l1; w=w1; } int area( ) { return (l*w); } }; void fun (point *p) { cout p-area( ) endl; } void main( ) { Rect rec(2,4,10,6); fun(rec); } 程序运行结果如下 : 点的面积为:0 输出结果表明在fun函数中,p所引用的对象执行的area操作被关联到point::area的实现代码上。这是因为静态联编的结果。在程序编译阶段,对p所引用的对象所执行的area操作只能绑定到point类的函数上。 解决这一问题是采用动态联编,即在执行fun时根据rec对象来自动确定调用相应的成员函数,而不是在编译时就确定哪个重载被调用。这种在运行时能依据其类型确认调用哪个函数的能力称多态性,也就是动态联编。 动态联编实际上是进行动态识别。 C++规定动态联编是在虚函数的支持下实现的。 2 虚函数和抽象类 2.1 虚函数的定义 虚函数的定义方法如下: virtual 函数类型虚函数名(参数列表); ① 类的静态成员函数不可以定义为虚函数。 ② 类的构造函数不可以定义为虚函数。 ③ 非类的函数不可以定义为虚函数。 定义虚函数要遵循的规定 虚函数是动态联编的基础。虚函数是成员函数,而且是非static的成员函数。如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。 总结动态联编的实现需要如下三个条件: (1) 要有说明的虚函数。 (2) 调用虚函数操作的是指向对象的指针或者对象引用。 (3) 由成员函数调用虚函数。 2.2 纯虚函数 纯虚函数的声明格式如下: virtual 函数类型虚函数名(参数表)= 0; 纯虚函数不可以被直接调用,也不可以被继承。 纯虚函数是一种特殊的虚函数,它只有函数的声明,没有具体实现函数的功能。在类的构造函数和析构函数中不能够调用它们,但其他成员函数可以调用它们。 2.3 抽象类 带有纯虚函数的类称为抽象类。 抽象类不能产生对象。 ·抽象类只能用作其他类的基类,不能建立抽象类对象。 ·抽象类不能用作参数类型、函数返回类型或显式转换的类型。 ·可以说明指向抽象类的指针,此指针可以指向它的派生类,进而实现多态性。 对于抽象类的使用有几点规定 抽象类是一种特殊的类,只能作为基类来使用,其虚函数的实现由派生类给出。这是为了抽象和设计目的而建立的,它处于继承层次结构的较上层。抽象类的主要作用是将有关的子类组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。 3 应用实例 【例1】编写一个程序计算正方形、球体和圆柱体的表面积和体积。 编程要点: (1) 从正方形、球体和圆柱体的各种运算中抽象出一个公共基类container为抽象基类。 (2) 在抽象基类中,定义求表面积和体积的2个纯虚函数。抽象类中定义一个公共的数据成员radius,可作为球的半经、正方体边长、圆柱体的底面半经。 类container 纯虚函数说明: surface_area(),volume()类cube 纯虚函数实现: surface_area(),volume()类sphere 纯虚函数实现: sur

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档