多态性与虚函数课件_第1页
多态性与虚函数课件_第2页
多态性与虚函数课件_第3页
多态性与虚函数课件_第4页
多态性与虚函数课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多态性与虚函数多态性与虚函数1函数重载与静态联编voidprint(char)voidprint(int)voidprint(float)voidprint(char*)……print("Hello,overload!");函数重载与静态联编voidprint(char)2函数重载与静态联编classMyClass{ public: MyClass(); MyClass(inti); MyClass(charc););MyClassc2(34);函数重载与静态联编classMyClass{3静态联编与动态联编静态联编:在编译时就能够确定调用哪个函数动态联编在运行时才能够动态确定调用哪个函数静态联编与动态联编静态联编:4动态联编的基础C++允许指向基类的指针可以指向其派生类的对象(downcasting)base*pObj; //base是一个基类derivedderivedObj; //derived是base的派生类pObj=&derivedObj; //基类指针可以指向派生类对象动态联编的基础C++允许指向基类的指针可以指向其派生类的对象5downcasting带来的问题classbase{ //......

intfunction();};classderived:publicbase{ //...... intfunction();};pObj->function(); //调用哪个函数?downcasting带来的问题classbase{6问题的解决--virtualclassbase{ //......

virtualintfunction();};classderived:publicbase{ //...... intfunction();};pObj->function();//根据pObj所指的对象正确调用相应函数 问题的解决--virtualclassbase{7虚函数的含义是一个类的成员函数可以为派生类对象使用,是所有对象的通用实现派生类可以通过编写自己的成员函数来替代基类的虚函数,这种替代是基类预见到的、默认的、甚至是赞成的。虚函数的含义是一个类的成员函数8虚函数举例学生(Student)本科生(UndeGrad)研究生(PostGrad)硕士研究生(MastCand)博士研究生(DoctCand)虚函数举例学生(Student)本科生研究生硕士研究生博士研9classStudent{protected: charname[30]; intage; //......public:

virtualvoidSelectCourse(); //选课

virtualintCalculateCredit(); //计算总学分 //...};classStudent{10//UndeGrad没有重新实现两个虚函数,//它使用基类的实现classUndeGrad:publicStudent{ //......public: voidPractice(); //工程实践 //...};//UndeGrad没有重新实现两个虚函数,11//PostUndeGrad重新实现了两个虚函数classPostGrad:publicStudent{ //...... intsuperVisorID; //导师public:

voidSelectCourse(); //选课 intCalculateCredit(); //计算总学分 //...};//PostUndeGrad重新实现了两个虚函数12//MasterCand使用PostGrad提供的虚函数classMasterCand:publicPostGrad{ //...... public: //...};//MasterCand使用PostGrad提供的虚函数13//DoctorCand重新实现了两个虚函数classDoctorCand:publicPostGrad{ //...... public: voidSelectCourse(); //选课 intCalculateCredit(); //计算总学分 //...};//DoctorCand重新实现了两个虚函数14voidmain(){ Student*s;

//程序运行过程中动态创建学生对象,可能是以下各种语句 // s=newUndeGrad(); // s=newPostGrad(); // s=newDoctCand();

s=newMasterCand(); s->SelectCourse(); //调用PostGrad::Selectcourse()}voidmain()15virtual的含义virtual只在类继承时才发挥作用virtual告诉编译器,它所修饰的函数需要动态联编(dynamicbinding)。在调用该函数时,需要根据对象的实际类型决定使用类继承层次中哪个类的成员函数virtual的含义virtual只在类继承时才发挥作用16使用虚函数的例子//students存放所有学生的信息 Student*students[300]; //指针数组 intstudNum; //学生数目//在程序运行过程中动态建立了num个学生对象//students[studNum++]=newDoctCand();//students[studNum++]=newUndeGrad();//......使用虚函数的例子//students存放所有学生的信息17使用虚函数的例子//所有学生选课voidStudentSelectCourse(){ for(inti=0;i<studNum;i++) students[i]->SelectCourse()}使用虚函数的例子//所有学生选课18voidStudentSelectCourse(){ for(inti=0;i<studNum;i++) { switch(student[i]->type){ caseGRAD: //本科生 student[i]->UndeGrad::SelectCourse();break; casePOST: //研究生 student[i]->PostGrad::SelectCourse();break; caseDOCT: //博士生 student[i]->DoctCand::SelectCourse();break; //......}不用虚函数机制的程序非常复杂voidStudentSelectCourse()不用虚19虚函数带来的好处简化程序可以编写为多种不同对象类型正确工作的代码方便维护类层次的修改、实现的修改产生的影响小是多态性的语言实现虚函数带来的好处简化程序20多态性含义:一个对象在其生存期内可以具有多种形态一种调用可以有多种执行方式作用:让使用和实现分开,实现了一定的封装简化了程序设计,高层操作和低层操作分开多态性含义:21多态性的好处voidStudentSelectCourse(){ for(inti=0;i<studNum;i++) students[i]->SelectCourse()}复杂的实现多态性的好处voidStudentSelectCours22特殊的虚函数虚析构函数保证了对象的正确释放纯虚函数必须由派生类定义的虚函数特殊的虚函数虚析构函数23析构函数voidRemoveAllStudents(){ for(inti=0;i<studNum;i++) deletestudents[i];}调用析构函数Student::~Student()析构函数voidRemoveAllStudents()调用24虚析构函数classUndeGrad:Student{ //...

char*somePersonalInfo; public: UndeGrad(); ~UndeGrad();

//......其它操作函数};

派生类中动态分配了空间虚析构函数classUndeGrad:Student25虚析构函数classStudent{ //... public: Student(); virtual~Student(); //......其它操作函数};

定义虚析构函数虚析构函数classStudent{定义虚析构函数26虚析构函数voidRemoveAllStudents(){ for(inti=0;i<studNum;i++) deletestudents[i];}调用正确的析构函数虚析构函数voidRemoveAllStudents()调27虚析构函数作用:保证调用正确的析构函数保证对象的正确释放保证系统资源的合理使用注意:构造函数不能是虚函数析构函数可以(而且应该)定义为虚函数

虚析构函数作用:28纯虚函数classAbstract_Student{protected: charname[30]; intage; //......public:

virtualvoidSelectCourse()=0;

virtualintCalculateCredit()=0; //...};纯虚函数classAbstract_Student{29//UndeGrad必须实现基类的纯虚函数classUndeGrad:publicAbstract_Student{ //......public: voidSelectCourse()

; intCalculateCredit(); //...};//UndeGrad必须实现基类的纯虚函数30//PostGrad可以保持两个纯虚函数的定义classAbstract_PostGrad:publicAbstract_Student{ //...... intsuperVisorID; //导师public: voidSelectCourse()=0; intCalculateCredit()=0 ; //...}; //PostGrad可以保持两个纯虚函数的定义31//DoctorCand必须实现两个虚函数classDoctorCand:publicAbstract_PostGrad{ //...... public: voidSelectCourse(); intCalculateCredit(); //...};//DoctorCand必须实现两个虚函数32纯虚函数含义:纯虚函数是将要被派生类实现的函数用法:具有纯虚函数的类不能实例化派生类如果还有纯虚函数,则还不能实例化能实例化的派生类必须实现所有纯虚函数作用:为抽象基类的定义提供了手段为所有派生类设计一个标准接口,方便高层应用逻辑的设计纯虚函数含义:33虚函数的使用好处:多态性缺点:增加运行开销每个对象增加一个指针调用虚函数时要查表虚函数的使用好处:多态性34虚函数的内部实现nameagestudentID......v-pointerStudent::SelectCoursePostGrad::SelectCourseDoctorCand::SelectCourseStudent::SelectCoursePostGrad::SelectCourseDoctorCand::SelectCoursev-table学生对象如果没有虚函数,则对象没有这个特殊成员虚函数的内部实现nameStudent::SelectCou35虚函数与类层次的关系ABCDEvirtual只要在基类中说明一次virtual虚函数与类层次的关系ABCDEvirtual只要在virtu36虚函数与类层次的关系virtual关系开始于说明它的那个类A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论