8多态性 虚函数.ppt
文本预览下载声明
8.1 多态性概述 从字面上理解,多态(polymophism)是指一个名字,多种形态。 在面向对象程序设计中,多态就是指通过同一个接口,可以调用不同的程序,即“一个接口,多种方法”。 面向对象程序设计的精华 通过一个简单的接口对不同的实现进行概念上的简化。 class walkman{ virtual void on( )=0; virtual void off( )=0; virtual void play( )=0; virtual void record( )=0; virtual void stop( )=0; }; Cassette player, CD player, MD player, MP3 player; 应用多态性的好处 多态应用于OOP的目的是允许用一个名字来指定一类动作(即逻辑上相似的动作)。 从而带来以下的好处: 提高了处理问题的抽象级别; 降低了程序设计时的复杂性; (程序员只需记住一个接口,而不是好几个。) C++实现的多态性 编译时多态性: 函数重载 运算符重载 模板 运行时多态性: 借助虚函数来获得 8.2 静态联编和动态联编 什么叫联编(Binding)? 一个源程序需要经过编译、连接,才能成为可执行代码。 上述过程中需要将一个函数调用链接上相应的函数代码,这一过程称为联编。 联编的目的是要建立函数调用与函数体之间的联系, 即将一个函数调用连接到一函数的入口地址。 C++支持两种联编 静态联编:在程序被编译时进行联编;(早联编) 程序执行快,但灵活性较小。 动态联编:在程序运行时联编。(晚联编,滞后联编) 灵活性高,程序执行慢。 动态联编是C++实现运行时多态性的关键因素。 8.3 虚函数 virtual float area( ){ return -1;} 虚函数是类的成员函数。virtual 关键字的作用:指示C++编译器对该函数的调用进行动态联编。 在使用了虚函数后,在派生类中,派生类的虚函数就取代了基类原来的虚函数,因此在使用基类指针指向派生类对象后,调用虚函数时就调用了派生类的虚函数,而不能调用基类的虚函数。 C++规定,当一个类的成员函数被声明为虚函数后,其派生类中的同名函数(函数原型完全相同)自动成为虚函数。只是在函数头部可省略virtual关键字。 虚函数是动态联编的基础 virtual 关键字的作用:指示C++编译器对该函数的调用进行动态联编,即在运行时才确定具体调用哪个函数。 尽管可以用对象名和点运算符的方式调用虚函数,即向对象发送消息: tri.area( ) 或者 rect.area( ) 这时是静态联编方式。 只有当访问虚函数是通过基类指针s时才可获得运行时的多态性。 虚函数小结 如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。 为了实现运行时的多态性,调用虚函数应该通过基类对象指针。 只有通过指针或引用对象来操作虚函数时,才对虚函数采取动态联编方式。 如果采用一般类型的标识对象来操作虚函数,则将采用静态联编方式调用虚函数。 虚函数不能是友元函数、内联函数、静态函数。 一个虚函数无论被公有继承多少次,仍保持其虚函数的特性。 虚函数小结(续) 构造函数不能是虚函数,但析构函数可以是虚函数。 设计C++程序时,一般在基类中定义处理某一问题的接口和数据元素,而在派生类中定义具体的处理方法。 通常都将基类中处理问题的接口设计成虚函数,然后利用基类对象指针调用虚函数,从而达到单一接口,多种功能的目的。 8.4 纯虚函数和抽象类 纯虚函数是指在基类中声明但是没有定义的虚函数,而且设置函数值等于零。 virtual type func_name(parameter list) =0; 通过将虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数。 如果没有在派生类中重新定义,编译器将会报告错误。 抽象类 抽象类:包含有纯虚函数的类称为抽象类。抽象类的作用是作为一个类族的共同基类,或者说,为一个类族提供一个公共接口。 不能定义抽象类的对象,但能定义指向抽象类的指针,一个抽象类只能作为基类来派生其他的类。 抽象类的指针用于指向该抽象类的派生类的对象。 8.5 应用举例 人员管理系统: 有四类人员:经理、技术人员、推销人员,还有销售经理。 月薪:经理:8000元/月;技术人员:100元/小时;推销人员:4%提成;销售经理:5000元月+5%提成。 问题分析 在第6章中,这个程序有两点不足: ①基类的成员函数pay( )和displayStatus( )的函数体均为空,在实现部分仍要写出函数体,显得冗余。 ②在main()函
显示全部