c第11次课和qt139继承多态_第1页
c第11次课和qt139继承多态_第2页
c第11次课和qt139继承多态_第3页
c第11次课和qt139继承多态_第4页
c第11次课和qt139继承多态_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、回顾基类和派生类对象的转换类指针的使用多重继承复合与继承的关系虚基类概念虚基类构造函数虚继承1目标静态绑定和动态绑定的概念多态性的意义和作用虚函数的定义方法抽象基类的作用和定义方法虚析构函数的作用和使用方法如何在程序中实现多态性2多态性的概念多态性是面向对象程序设计的重要特征之一多态性概念:具有继承关系的类,其对象对同一个函数调用可以作出不同的响应同一个函数调用同一条函数调用语句不同的响应执行不同的函数3静态绑定与动态绑定静态绑定编译时就能确定一条函数调用语句要调用的函数在程序编译时多态性体现在函数和运算符的重载上动态绑定运行时才能确定函数调用语句调用的函数程序运行时的多态性通过继承和虚函数来

2、体现4多态性的优点多态性有助于更好地对程序进行抽象控制模块能专注于一般性问题的处理具体的操作交给具体的对象去做多态性有助于提高程序的可扩展性可以把控制模块与被操作的对象分开可以添加已定义类的新对象,并能管理该对象可以添加新类(已有类的派生类)的新对象,并能管理该对象5虚函数虚函数的概念:在基类中冠以关键字 virtual 的成员函数虚函数的定义:virtual 函数类型 函数名称(参数列表);如果一个函数在基类中被声明为虚函数,则他在所有派生类中都是虚函数(包括重定义函数)只有通过基类指针或引用调用虚函数才能引发动态绑定6虚函数的使用2-1/文件base.h定义基类#if !defined B

3、ASE_H#define BASE_Hclass Base public:virtual void show();#endif/文件base.cpp基类的实现#include “base.h”#include void Base:show() coutI am Bases object!n;/文件derived.h定义派生类Derived#if !defined DERIVED_H#define DERIVED_H#include base.hclass Derived :public Basepublic:void show();#endif#include “derived.h”#incl

4、ude void Derived:show() coutshow();/用基类指针调用成员函数,动态绑定bPtr= &dObj;/基类指针指向基类对象bPtr-show();/用基类指针调用成员函数,动态绑定return 0;8虚函数的注意事项在类体系中访问一个虚函数时,应使用指向基类类型的指针或对基类类型的引用,以满足运行时多态性的要求。在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的说明完全一致,否则就属于隐藏。若在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码。虚函数必须是类的一个成员函数,不能是友元,但它可以是另一个类的友元。虚函数不得是一个静态成员。

5、(暂时不讨论)9虚函数和重载函数的区别成员函数被重载需要在相同范围(同一个类中),而虚函数要求在不同的范围(一个在派生类,一个在基类)重载函数要求函数有相同的函数名称,并有不同的参数序列;而虚函数则要求这三项(函数名、返回值类型和参数序列)完全相同重载函数可以是成员函数或友员函数,而虚函数只能是成员函数(暂时先不看)重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数虚函数在运行时表现出多态功能,这是C+的精髓;而重载函数则在编译时表现出多态性10虚析构函数2-1动态对象的创建new ClassName();ClassName指明了要调用的构

6、造函数动态对象的撤销delete 基类指针;如果基类指针指向的是派生类的对象呢?11虚析构函数2-2析构函数可以声明为虚函数delete 基类指针;程序会根据基类指针指向的对象的类型确定要调用的析构函数基类的析构函数为虚函数,所有派生类的析构函数都是虚函数构造函数不得是虚函数如果要操作具有继承关系的类的动态对象,最好使用虚析构函数。特别是在析构函数需要完成一些有意义的操作比如释放内存时12虚析构函数使用4-1/文件employee.h,定义基类Employee#include #if !defined EMPLOYEE_H#define EMPLOYEE_Hclass Employeepubl

7、ic:Employee()coutEmployee begin!endl; virtual Employee() coutEmployee end!endl;#endif/文件accountant.h定义派生类Accountant#include #include employee.hclass Accountant: public Employeepublic:Accountant(int n) coutAccountant begin!“endl;age = n;Accountant() coutAccountant end!endl;private:int age;13虚析构函数使用4-

8、2/文件programmer.h/定义派生类Programmer#ifndef PROGRAMMER_H#define PROGRAMMER_H#include employee.hclass Programmer: public Employeepublic:Programmer(char *str) ;Programmer();private:char *name;#endif/文件programmer.cppinclude “programmer.h”#include #include Programmer: Programmer() delete name; coutProgramme

9、r end!“endl;Programmer:Programmer(char *str)coutProgrammer begin!“endl;name = new charstrlen(str)+1;strcpy(name, str);14虚析构函数使用4-3#include accountant.h#include programmer.hconst int MAX = 100;void main() int no;/声明储存雇员信息的数组Employee *ptrMAX, *tptr;int ENum = 0;char name100;int age;for (int i=0; iMAX;

10、 i+) ptri = NULL; /输入雇员信息coutInput employees info:“endl;cout1 - Programmer“endl2 - Accountantendl0 - exitno;while (no)15虚析构函数使用4-4switch (no) case 1:/输入程序员信息coutname;tptr = new Programmer(name);ptrENum+ = tptr;break;case 2:/输入会计信息coutage;tptr = new Accountant(age);ptrENum+ = tptr;break;default :brea

11、k; coutInput another employees info:“endl;cout1 - Programmerendl2 -Accountantendl0 - exit“no;16纯虚函数2-1实现多态性的前提需要有共同的基类需要在基类中定义共同的接口接口要定义为虚函数如果基类的接口没办法实现怎么办?如形状类Shape解决方法不实现这些接口:纯虚函数包含纯虚函数的类:抽象基类17纯虚函数2-2在基类中不能给出有意义的虚函数定义,这时可以把它说明成纯虚函数,把它的定义留给派生类来做定义纯虚函数:class 类名 virtual 返回值类型 函数名(参数表) = 0; ;纯虚函数不需要实

12、现18抽象类2-1如果一个类中至少有一个纯虚函数,那么这个类被成为抽象类(abstract class)抽象类存在的意义是作为其它类的基类,也叫抽象基类主要作用:取若干类的共同行为,形成更清晰的概念层次。19抽象类2-2抽象类不能用于直接创建对象实例,可以声明抽象类的指针和引用可使用指向抽象类的指针支持运行时多态性派生类中必须重载基类中的纯虚函数,否则它仍将被看作一个抽象类20抽象类的使用4-2/文件circle.h,定义派生类Circle#if !defined CIRCLE_H#define CIRCLE_H#include shape.h#define PI 3.1416class Ci

13、rcle :public Shape public:Circle(double=0.0,double=0.0,double=1.0); double area() const; void show() const;private: double x,y; double r;#endif/文件circle.cpp,实现类Circle#include circle.hCircle:Circle(double a, double b, double c)x = a;y = b; r = c;double Circle:area() const return PI*r*r; void Circle:s

14、how() const coutI am a Circle: ;21抽象类的使用4-1/文件shape.h/定义抽象基类Shape#if !defined SHAPE_H#define SHAPE_H#include class Shapepublic:virtual double area() const = 0;virtual void show() const = 0;#endif22抽象类的使用4-3/文件rectangle.h/定义派生类Rectangle#if !defined _RECTANGLE_H_#define _RECTANGLE_H_#include shape.hcl

15、ass Rectangle :public Shape public: Rectangle(double = 1.0, double = 1.0); double area() const; void show() const;private: double length; double width;#endif/文件rectangle.cpp,实现类Rectangle#include rectangle.hRectangle:Rectangle(double a, double b) length = a; width = b;double Rectangle:area() const return length*width;void Rectangle:show() const cout I am a Rectangle: ;23抽象类的使用4-4#include circle.h#include rectangle.hvoid callArea(Sh

温馨提示

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

评论

0/150

提交评论