C++面向对象程序设计多态性与虚函数.ppt
《C++面向对象程序设计多态性与虚函数.ppt》由会员分享,可在线阅读,更多相关《C++面向对象程序设计多态性与虚函数.ppt(25页珍藏版)》请在三一办公上搜索。
1、1,C+面向对象程序设计,第九章 多态性与虚函数,2,学习目标,理解多态性和虚函数的概念了解静态多态性和动态多态性掌握虚函数的定义和调用方法掌握多态性的实现方法以及虚函数在其实现中起到的作用掌握纯虚函数和抽象类的概念及应用,3,9.1 为什么需要多态性,前面章节讲述了面向对象程序设计的重要机制:数据抽象、封装和继承,多态性也是面向对象的重要特征之一。若语言不支持多态,则不能称为面向对象的。只支持类而不支持多态,只能称为基于对象的,如Ada,VB等。多态性的应用,使面向对象编程技术比较容易处理各种对象之间的相互作用;可以使编程显得更为简捷、便利,易于对程序进行开发和扩展,它为程序的模块化设计提供
2、了又一手段。在进行面向对象编程时,C+力求模仿客观世界的规律。多态性概念也是体现了现实社会中各个事物之间的联系和作用。对同一个消息,不同的对象会有不同的反应。比如一个经理要到外地出差,他会把这个消息告诉他身边的人:他的妻子、秘书、下属;这些人听到这个消息会有不同的反应:他的妻子会为他准备行李,下属会为他准备出差的材料,秘书会为他安排车票和住宿。这就体现了多态性。多态性的概念是同样的消息被类的不同对象接收时导致完全不同行为的一种现象。消息指对类的成员函数的调用。换句话说,每个不同的对象可以以适合自己的方式去响应对同一个成员函数的调用。简单地讲,多态性就是一种实现“一种接口,多种方法”的技术,是面
3、向对象程序设计的重要特性。,4,9.1.1 多态性的实现方法,同一段代码,当用不同的对象去调用时,该代码具有不同的功能,这称为多态性。C+提供的多态性分为静态多态性(编译时多态)和动态多态性(运行时多态)。静态多态性是一种编译时的多态,是通过重载和模板实现的。动态多态性是一种运行时的多态,其基础是数据封装和继承机制,通过继承建立类层次,并通过在基类中定义虚函数来实现多态性,即在基类和派生类中建立同名的函数,但是函数的功能是不同的。函数重载实现多态:对同一个函数名,当用不同的实参调用时,会调用到不同的重载函数版本,因而完成不同的功能,这是一种多态性的体现。模板实现多态:模板是一类函数或类的样板,
4、通过用不同的模板实参调用模板,同一个名字可生成不同的具体函数或具体类,从而实现不同的功能,这也是一种多态性的体现。虚函数实现多态:通过动态束定机制,使相同的函数调用代码可能调用不同的类(基类或派生类)的虚函数,从而完成不同的功能,这又是一种多态性的体现。,5,9.1.2 静态多态性和动态多态性,编译时多态通过静态联编实现,运行时多态通过动态联编实现。1 联编在面向对象程序设计中,联编(binding)的含义是把一个函数名与其实现的代码联系在一起,即主调函数代码必须与被调函数代码连接起来。按照联编所在的阶段,联编分为静态联编(static binding)和动态联编(dynamic bindin
5、g)。静态联编又称先期联编(early binding),是在编译时进行的,即是在编译阶段就必须确定函数名与代码间的对应关系。换句话说,主调函数和被调代码的关系早在编译时就确定了。动态联编又称迟后联编(late binding),是在程序运行过程中根据程序运行时的需要进行的。根据对象的不同来决定调用哪个(成员)函数进行联编。在编译阶段,系统还不能确定两者的对应关系。动态多态性是与动态联编相联系的。,6,静态联编的最大优点是速度快,运行时的开销仅仅是传递参数、执行函数调用、清除栈等。不过,程序员必须预测在每一种情况下,在所有的函数调用中,将要使用哪些对象。这不仅具有局限性,有时也是不可能的。动态
6、联编的问题显然是执行效率。这必须由代码本身在运行时刻推测调用哪个函数,然后再调用它。有些语言,如Smalltalk,仅使用动态联编。仅用动态联编大大加强了语言的功能,但速度浪费也很严重。ANSI C只使用静态联编,结果是速度快但灵活性不够。,7,2 静态多态性,在没有类层次的场合,使用函数重载的方式实现静态多态性。各个重载函数名称相同,但参数表应在参数个数、类型和次序上有所不同。编译器根据参数表来识别各个重载函数。根据参数表,系统在编译时就完成静态联编的过程。关于没有类层次的函数重载实现多态的例子前面已经介绍,这里不再赘述。在建立了类层次的场合,各个类可以有名字和参数表相同的成员函数。图9.1
7、显示出单继承建立的类层次。Student类描述学生的特征。派生类Smallstudent描述小学生特征。派生类中重载了函数print()。每个类的成员函数print()功能是显示相应对象的数据成员。我们想实现不同的对象调用print()时,输出不同的内容实现多态性。但是,如果基类中的没有将函数print()定义为虚函数,那么,即使在类层次中该函数被重载(函数名字和参数表完全相同),仍然不可能实现任何多态性。在这种场合,联编还是静态的。,8,【例9-2】派生类对象替换基类对象。,见教材P114从运行结果可以看出,以上几种方式调用的都是基类的Speak()函数。因而可以得到下列重要结论:不论哪一种
8、情形,派生类对象替换基类对象后,只能当作基类对象来使用。不论派生类是否存在同名覆盖成员,这样的基类对象所访问的成员都只能来自基类。那么如何才能得到我们需要的结果呢(形成多态)?可以使用虚函数来实现动态联编。,9,3 虚函数和动态多态性,要获得多态性的对象,必须建立一个类等级。在建立了类层次后,实现动态多态性的方法是在基类中定义虚函数(virtual functions)。虚函数的声明方法是在基类中的成员函数前用关键字virtual说明,在派生类中,重载的虚函数名之前可略去关键字virtual。其原型格式如下:virtual 函数返回类型 函数名(参数表);虚函数存在于继承关系中,当一个类的成员
9、函数声明为虚函数后,在该类的直接或间接的派生类中就可以定义与该基类中虚函数相同的函数(函数返回类型、函数名和参数表完全相同,但函数体不同。注意与函数的重载不同)。当编译器看见虚函数时,就会实行动态联编。因此当用基类指针指向带有虚函数的基类的派生类对象时,系统会自动用派生类中的同名函数去代替基类中的虚函数,这个过程称为覆盖(overriding)。而对于非虚函数,编译器则会采用静态联编。,10,【例9-3】利用虚函数输出学生的不同的信息。,见教材P116区别在于:将基类Student中的成员函数print()定义为虚函数。在主函数main()中,分别建立了Student和Smallstudent
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 程序设计 多态性 函数
链接地址:https://www.31ppt.com/p-5085507.html