c多态性学习教程.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《c多态性学习教程.pptx》由会员分享,可在线阅读,更多相关《c多态性学习教程.pptx(53页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、在C+程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。或指发出同样的发出同样的消息消息被不同类型的对象被不同类型的对象接收时导致完全接收时导致完全不同的行为不同的行为。消息:对成员函数的调用消息:对成员函数的调用不同的行为:不同的函数实现不同的行为:不同的函数实现7.1 多态性的概念第1页/共53页多态的实现 函数重载(静态多态)运算符重载(静态多态)虚函数(动态多态)例7-1第2页/共53页 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函数名对应着不同的实现。函数重载的条件是要求函数参数的类型或个数有所不同。对成员函
2、数的重载有以下三种表达方式:1、在一个类中重载;2、在不同类中重载;3、基类的成员函数在派生类中重载。函数重载函数重载第3页/共53页具有相同名字的重载函数是在编译时区分的,有以下三种区分方法:1、根据参数的特征加以区别,例如:show(int,char);show(char*,float);2、使用类作用域符“:”加以区分,例如:Circle:show();Point:show();3、根据类对象加以区分,例如:()调用Circle:show()()调用Point:show()第4页/共53页 除了函数重载这种简单形式之外,C+还提供了一种更为灵活的特征机制虚函数。虚函数允许函数调用与函数体
3、的联系在运行时才给出。当需要同一接口、多种实现时,这种功能显得尤其重要。在讲述虚函数的概念之前,先介绍子类型及静态联编和动态联编的相关内容。虚函数的引入第5页/共53页(动态多态)要研究的问题是:当一个基类被继承为不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果在运行时用同一个成员名调用类对象的成员,会调用哪个对象的成员?第6页/共53页举例 根据类型适应性,在公有继承方式下,指向基类和派生类的指针变量是相关的。如果B 是基类,D 是从B 公有派生出来的派生类,则在C+中,指向基类B 的指针P 也可以指向派生类D。当P 指向派生类D 的对象时,利用指针P 可以访问从基类B 继承的成
4、员,但派生类D 自己定义的成员不能用P 访问(除非用显式类型转换)。第7页/共53页 例如:下面是指向基类对象的指针指向派生类对象,而访问从基类继承的成员的例子。#include#include class B char name80;public:void put_name(char*s)strcpy(name,s);void show_name()coutname“n”;第8页/共53页class D:public B char phone_num80;public:void put_phone(char*num)strcpy(phone_num,num);void show_phone(
5、)coutphone_numput_name(“Zhang Fang”);p=&Dobj;p-put_name(“Wang Ming”);/访问从基类继承的成员函数 ();();dp=&Dobj;dp-put_phone(“83768493”);/访问自己的成员 dp-show_phone();p-show_phone();/error /指向基类指针不能访问派生类定 义的成员 (D*)P)-show_phone();/强行类型转换第10页/共53页结果:结果:Zhang FangWang Ming8376849383768493 注意:希望用基类指针访问其公有派生类的特定成员,必须将基类指针
6、用显式类型转换为派生类指针。根据类型适应性的原则,一个指向基类的指针可用来指向以公有派生的任何对象是C+实现运行时多态性的关键。第11页/共53页CommissionEmployeeclass CommissionEmployeepublic:CommissionEmployee(const string&,const string&,const string&,double=0.0,double=0.0);void setFirstName(const string&);/set first name string getFirstName()const;/return first name
7、 void setLastName(const string&);/set last name string getLastName()const;/return last name void setSocialSecurityNumber(const string&);/set SSN string getSocialSecurityNumber()const;/return SSN void setGrossSales(double);/set gross sales amount double getGrossSales()const;/return gross sales amount
8、 void setCommissionRate(double);/set commission rate double getCommissionRate()const;/return commission rate double earnings()const;/calculate earnings void print()const;/print CommissionEmployee objectprivate:string firstName;string lastName;string socialSecurityNumber;double grossSales;/gross week
9、ly sales double commissionRate;/commission percentage;/end class CommissionEmployee第12页/共53页BasePlusCommissionEmployeeclass BasePlusCommissionEmployee:public CommissionEmployeepublic:BasePlusCommissionEmployee(const string&,const string&,const string&,double=0.0,double=0.0,double=0.0);void setBaseSa
10、lary(double);/set base salary double getBaseSalary()const;/return base salary double earnings()const;/calculate earnings void print()const;/print BasePlusCommissionEmployee objectprivate:double baseSalary;/base salary;/end class BasePlusCommissionEmployee第13页/共53页派生类指针指向基类对象int main()CommissionEmplo
11、yee commissionEmployee(Sue,Jones,222-22-2222,10000,.06);BasePlusCommissionEmployee*basePlusCommissionEmployeePtr=0;/aim derived-class pointer at base-class object /Error:a CommissionEmployee is not a BasePlusCommissionEmployee basePlusCommissionEmployeePtr=&commissionEmployee;return 0;/end main第14页/
12、共53页基类对象指针指向派生类对象 这种情况下,要访问派生类的成员函数,要做:/强制类型转换如:(BasePlusCommissionEmployee*)commissionEmployeePtr)-print();第15页/共53页确定调用的具体对象的过程称为关联(binding)。在这里是指把一个函数名与一个类对象捆绑在一起,建立关联。一般地说,关联指把一个标识符和一个存储地址联系起来。7.2 静态关联与动态关联 第16页/共53页在编译时即可确定其调用的函数,其过程称为静态关联(static binding),由于是在运行前进行关联的,故又称为早期关联(early binding)。在运
13、行阶段把虚函数和类对象“绑定”在一起的,此过程称为动态关联(dynamic binding)。这种多态性是动态的多态性,即运行阶段的多态性。由于动态关联是在编译以后的运行阶段进行的,因此也称为滞后关联(late binding)。第17页/共53页多态性分为两类:静态多态性和动态多态性。(1)静态多态:(例7-1)(在程序编译时系统就能决定调用的是哪个函数),因此静态多态性又称编译时的多态性。静态多态是通过函数重载来实现的。(2)动态多态(在例7-1基础上加virtual)是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtual functi
14、on)实现的。第18页/共53页在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。编译系统按照同名覆盖的原则决定调用的对象。例7.2 基类与派生类中有同名函数。7.3 虚函数 7.3.1 虚函数的作用第19页/共53页虚函数的作用:允许在派生类中重新定义与基类同名的函数,并且通过基类指针或引用来访问基类和派生类中的同名函数,实现动态多态的效果。第20页/共53页虚函数是一种非静态的成员函数,定义格式如下:virtual()/其中,virtual 是关键字。如果某个类中的一个成员函数被说明为虚函数,该成员函数可能在派生类中存在着不同的实现版本。由于存在有
15、虚函数,编译器将进行动态联编,使调用虚函数的对象在运行时确定,以实现动态联编的多态性。第21页/共53页例如:使用虚函数将上例改为动态联编的情况,将得到不同的结果#include class Base protected:int x;public:Base(int a)x=a;virtual void print()cout“Base”x“n”;第22页/共53页class First_d:public Base public:First_d(int a):Base(a)virtual void print()cout“First derivationn”x“n”;class Second_d
16、:public Base public:Second_d(int a)=Base(a)virtual void print()cout“Second derivationn”xprint();p=&obj2;p-print();p=&obj3;p-print();obj2.print();obj3.print();运行结果:Base 1 First derivation 2 Second derivation 3 First derivation 2 Second derivation 3程序中,p-print();出现了三次,由于p 指向的对象不同,每次执行了print()的不同实现版本。实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性 学习 教程
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内