版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、会计学1c多态性多态性第1页/共53页多态的实现第2页/共53页 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函数名对应着不同的实现。 函数重载的条件是要求函数参数的类型或个数有所不同。对成员函数的重载有以下三种表达方式:1、在一个类中重载;2、在不同类中重载;3、基类的成员函数在派生类中重载。第3页/共53页具有相同名字的重载函数是在编译时区分的,有以下三种区分方法:1、根据参数的特征加以区别,例如: show(int, char); show (char*, float);2、使用类作用域符“:”加以区分,例如: Circle:show(); Point:show()
2、;3、根据类对象加以区分,例如: ()调用Circle:show() ()调用Point:show()第4页/共53页 除了函数重载这种简单形式之外,C+ 还提供了一种更为灵活的特征机制虚函数。 虚函数允许函数调用与函数体的联系在运行时才给出。当需要同一接口、多种实现时,这种功能显得尤其重要。 在讲述虚函数的概念之前,先介绍子类型及静态联编和动态联编的相关内容。第5页/共53页第6页/共53页第7页/共53页 例如:下面是指向基类对象的指针指向派生类对象,而访问从基类继承的成员的例子。 #include #include class B char name80; public: void pu
3、t_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() coutphone_numput_name(“Zhang Fang”); p=&Dobj; p-put_name(“Wang Ming”); /访问从基类继承的成员函数 (); (); dp=&Dobj; dp-put_
4、phone(“83768493”); /访问自己的成员 dp-show_phone(); p-show_phone(); /error / 指向基类指针不能访问派生类定 义的成员 (D *)P)-show_phone(); /强行类型转换第10页/共53页Zhang FangWang Ming8376849383768493 注意:希望用基类指针访问其公有派生类的特定成员,必须将基类指针用显式类型转换为派生类指针。根据类型适应性的原则,一个指向基类的指针可用来指向以公有派生的任何对象是C+ 实现运行时多态性的关键。第11页/共53页第12页/共53页第13页/共53页第14页/共53页第15页
5、/共53页第16页/共53页行阶段的多态性。由于动态关联是在编译以后的运行阶段进行的,因此也称为滞后关联(late binding)。第17页/共53页是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。第18页/共53页第19页/共53页第20页/共53页虚函数是一种非静态的成员函数,定义格式如下:virtual () /其中,virtual 是关键字。 如果某个类中的一个成员函数被说明为虚函数,该成员函数可能在派生类中存在着不同的实现版本。 由于存在有虚函数,编译器将进行动态联编,使调用虚函数的对象在运行时
6、确定,以实现动态联编的多态性。第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: public Bas
7、e 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()
8、的不同实现版本。第24页/共53页1、在基类中,将该函数说明为虚函数(virtual);2、定义基类的公有派生类;3、在基类的公有派生类中重载该虚函数;4、定义指向基类的指针变量,它指向基类的公有派生类的对象。 重载虚函数不是一般的重载函数,它要求函数名、返回类型、参数个数、参数类型和顺序完全相同。 由于对虚函数进行重载,因此,在派生类中的虚函数前的virtual关键字可以省略。第25页/共53页例如:下面是“单界面、多实现版本”概念的另一个程序例子#include class figure protected: double x,y; public: void set_dim(double
9、i; double j=0) x=i; y=j; virtual void show_area() cout“No area computation define ”; cout“for this class.n”; ;第26页/共53页class triangle: public figure public: void show_area() cout“Triangle with high”; coutx“and base”y; cout“has an ares of”; coutx*0.5*y; ;class square: public figure public: void show_
10、area() 第27页/共53页 cout“Square with dimension”; coutx“*”y; cout“has an area of”; coutx*y“n”; ;class circle: public figure public: void show_area() cout“Circle with radius”; coutx; cout“has an area of”; coutset_dim(10.0,5.0); p-show_area(); p= &s; p-set_dim(10.0,5.0); p-show_area(); p=&c; p-set
11、_dim(9.0); p-show_area(); 第29页/共53页第30页/共53页第31页/共53页第32页/共53页类中的所有成员函数都声明为虚函数。第33页/共53页第34页/共53页第35页/共53页纯虚函数是一种特殊的虚函数,是一种没有具体实现的虚函数,其定义格式如下:第36页/共53页Class D1 also is an abstract class.例如:下面举一个计算某些几何图形的面积之和的例子,以说明纯虚函数及抽象类的应用。例中各类之间的关系如下:ShapeTriangleRectangleCircleTrapezoidSquareApplicationMyProgra
12、m第37页/共53页# include Class ShapePublic: virtual double Area() const=0;class Circle: public Shape public: Circle(double r) R=r; double Area() const return 3.14*R*R; private: double R;第38页/共53页class Trapezoid: public Shape public: Trapezoid(double t, double b, double h) T=t; B=b; H=h; double Area() con
13、st return 0.5*(T+B)*H; private: double T,B,H;class Square: public Shape public: Square(double s) S=s; double Area() const return S*S; private: double S;第39页/共53页class Application public: double Compute(Shape *s ,int n) const;double Application:Compute(Shape *s , int n) const double sum=0; for(int i=
14、0; iArea(); return sum;第40页/共53页class MyProgram : public Application MyProgram(); Myprogram(); double Run(); private: Shape *S;MyProgram:MyProgram() S=new Shape *5; S0=new Triangle(3.0,5.0); S1=new Rectangle(5.0,8.0); S2=new Circle(8.5); S3=new Trapezoid(12.0,8.0,6.0); S4=new Square(6.8);第41页/共53页My
15、Program:MyProgram() for(int i=0; i5; i+) delete Si; /for(int i=0; i5; i+) delete S ;double MyProgram:Run() double sum=compute(S,5); return sum;void main() MyProgram M; cout“Areas sum=”M.Run()endl; 输出结果: Areas 第42页/共53页1、该程序定义了8个类,其关系如前图所示;2、类Shape 定义为抽象类,相当于Triangle 等5个类的根,Shape 类中定义纯虚函数Area(),在它的5个
16、派生类中定义其具体实现;3、在类Application 中定义了计算面积和的函数Compute(),在其派生类MyProgram 中定义Run()函数,以调用计算面积和函数Compute()。第43页/共53页该例说明的设计特点:类库和应用程序设计分开。几何图形面积类库建立抽象类,作为继承的层次结构中的公共根,方便图形的增添或减少。应用程序取决于用户需求,只需修改MyProgram 类的构造函数中的参数。第44页/共53页 抽象类包含一个或多个纯virtual函数,这些函数必须要在具体的派生类派生。 抽象类不能实例化对象。class character_device public: virtual int open(int opt)=0; virtual int close(int opt)=0; virtual int read(char *p, int n)=0; virtual int write(const char *p, int n)=0; virtual int ioct1(int )=0; virtual character_device() /virtual destructor;第45页/共53页第46页/共53页(4)如果在一个类中声明了纯虚函数,而在其派生类中没有对该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年东营科技职业学院单招职业倾向性考试必刷测试卷带答案解析
- 2026年山东铝业职业学院单招职业倾向性测试必刷测试卷带答案解析
- 2026年云南交通职业技术学院单招职业倾向性测试题库及答案解析(夺冠系列)
- 2026年信阳涉外职业技术学院单招职业适应性考试必刷测试卷及答案解析(夺冠系列)
- 地形地貌与灾害风险评估
- 房屋布置解压协议书
- 房屋承让协议书模板
- 房屋拆除新建协议书
- 房屋收回结清协议书
- 房屋流转使用协议书
- T-BMCA 029-2024 军工涉密业务咨询服务单位安全保密体系建设规范
- 山西省晋中市榆次区2024-2025学年八年级上学期期末学业水平质量监测道德与法治试卷(含答案)
- CAXA实体设计教程课件
- 网络设备生命周期管理-洞察分析
- 白居易《长恨歌》课件
- 人教版语文七年级上册期中测试卷及参考答案(3套题)
- ICU进修总结汇报课件
- 我的家乡成都课件
- 管理体系文件审查
- 电缆维护与保护方案
- DL∕T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
评论
0/150
提交评论