第六章 c++多态性.ppt_第1页
第六章 c++多态性.ppt_第2页
第六章 c++多态性.ppt_第3页
第六章 c++多态性.ppt_第4页
第六章 c++多态性.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章 多态性,C+面向对象程序设计教程,2,本章主要内容,类的多态性 虚函数 纯虚函数与抽象类,3,6.1 类的多态性,多态性是面向对象程序设计的重要特征,与封装性和继承性并称OOP三大特征。 封装性:类将相关数据和相应操作程序组合到一起。 继承性:派生类从基类继承相应特征 多态性:同样的名称,如函数名等,当不同类型的对象接收时产生不同的操作,4,类的多态性,多态性分类 重载: 函数重载同一函数名,根据实参的情况导致调用不同的函数 运算符重载同一运算符,根据运算量的类型决定是直接计算还是调用重载函数 联编: 将函数调用语句与同名函数中的执行代码联系起来的动作称为联编,5,6.1 类的多态性,

2、联编分类: 静态联编: 在编译阶段即决定该调用的同名函数 重载属于静态联编 不同类中出现同名函数时系统默认静态联编 动态联编 程序运行时才依据所处理的对象类型决定将要调用的函数 虚函数是动态联编 基类和派生类出现同名函数时两种联编会导致不同结果,实例一,实例二,静态联编与动态联编,#include /no6.1-3.cpp class Point /基类 public: Point(double i, double j) x = i; y = j; double Area( ) return 0.0; /同名函数 private: double x, y; ; class Rectangle:

3、public Point /派生类 public: Rectangle(double i, double j, double k, double l); double Area( ) return w*h; /同名函数 private: double w,h; ;,静态联编实例,Rectangle:Rectangle( double i, double j, double k, double l ) :Point( i, j ) w = k; h = l; void fun( Point ,静态联编实例,形参是基类Point类对象引用,实参是派生类Rectangle类对象,8,运行结果: Ar

4、ea = 0 结果分析:fun( )函数中,s是基类Point类对象,在静态联编状态下, s.Area( ) 在程序编译阶段即被确定是调用Point:Area( ) ,而不是根据实参对象类型决定调用哪个Area 。因此,导致程序输出了所不期望的结果。,静态联编实例,6.1 类的多态性,#include /no6.1-3A.cpp class Point /基类 public: Point(double i, double j) x = i; y = j; virtual double Area( ) return 0.0; /同名函数 private: double x, y; ; class

5、 Rectangle:public Point /派生类 public: Rectangle(double i, double j, double k, double l); virtual double Area( ) return w*h; /同名函数 private: double w,h; ;,动态联编实例,10,Rectangle:Rectangle( double i, double j, double k, double l ) :Point( i, j ) w = k; h = l; void fun( Point ,动态联编实例,6.1 类的多态性,形参是基类Point类对象

6、引用,实参是派生类Rectangle类对象,11,6.1 类的多态性,运行结果: Area= 375 动态联编状态下,编译阶段时并不决定s.Area( )的具体调用函数,而在运行时根据实参rec的类型决定s.Area( )是调用Rectangle类的Area函数 动态联编是在虚函数的支持下实现的,动态联编实例,12,6.2 虚函数,虚函数是动态联编的基础,它是类的成员函数 定义方法: 在类的声明中,在函数原型之前写virtual 例: virtual double Area( ) return 0.0; 调用方式: 通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数,13,6

7、.2 虚函数,注意: virtual 只写在原型声明处,不能用在函数实现时 虚函数是非静态成员函数 构造函数不能是虚函数,析构函数可以是虚函数 虚函数具有继承性。即基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数,14,虚函数实例,#include /no6.2-1.cpp class B0/基类B0声明 public:/外部接口 virtual void display ( ) /虚成员函数 cout B0:display( ) endl; ;,class B1: public B0/公有派生 public: void display( ) /同名但没有加virtual c

8、out B1:display( ) endl; ; class D1: public B1/公有派生 public: void display( ) /同名但没有加virtual coutD1:display( )endl; ;,void fun( B0 *ptr ) /普通函数,ptr是基类指针 ptr - display( ); void main( ) B0 b0, *p;/声明基类对象和指针 B1 b1;/声明派生类对象 D1 d1;/声明二层派生类对象 p = ,程序的运行结果为: B0:display( ) B1:display( ) D1:display( ),18,6.3 纯虚

9、函数与抽象类,无函数体的虚函数称为纯虚函数 纯虚函数的一般形式: virtual 类型 函数名( 形参表 ) = 0; 说明: 定义纯虚函数时,不能定义虚函数的实现部分 函数名赋于0,本质上是将指向函数体的指针值赋为初值0。此时本函数地址为空,这一点与空函数不一样,空函数是有地址的。 纯虚函数没有重载之前,不能调用 纯虚函数仅在抽象类中定义,纯虚函数与抽象类,19,6.3 纯虚函数与抽象类,至少包含一个纯虚函数的类称为抽象类 抽象类的一般形式: class 类名 virtual 类型 函数名(参数表) = 0; . ,抽象类的定义,20,6.3 纯虚函数与抽象类,抽象类为抽象设计的目的而建立,

10、将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为 不能声明抽象类对象,抽象类只能作为生成派生类的基类使用 对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现,抽象类的作用,21,#include /no6.2-1.cpp class B0 /抽象基类B0声明 public: /外部接口 virtual void display( ) =0 ; / 纯虚函数成员 ; class B1: public B0 /公有派生 public: void display( ) /虚成员函数不需加virtual cout B1:display( ) endl; ;,纯虚函数与抽象

11、类实例,6.3 纯虚函数与抽象类,class D1: public B1 public: void display( ) /虚成员函数 cout display( ); void main( ) B0 *p; /声明抽象基类指针 B1 b1; D1 d1; /声明派生类对象 p = /调用派生类D1函数成员 ,前一页,休息,后一页,23,程序的运行结果为: B1:display( ) D1:display( ),纯虚函数与抽象类实例,6.3 纯虚函数与抽象类,24,6.4 综合举例,例:编写小型公司人员信息管理系统 某小型公司主要有人员,经理、兼职技术人员、销售经理和兼职推销员。现在需要存储这

12、些人员的姓名、编号(从1001开始)、级别、当月薪水、计算月薪总额并显示全部信息。 月薪计算方法:经理拿固定月薪8000元兼职技术人员按每小时100元领取月薪兼职推销员月薪按当月销售额的4%提成销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售额的5。 编写升级函数:所有人初始级别为1,然后升级。经理为4级,技术人员和销售经理为3级,销售员为1级。,25,公司人员信息管理系统,6.4 综合举例,派生类销售经理由两个基类派生而得,为多继承。,26,6.4 综合举例,class employee protected: char *name;/姓名 int ind

13、ividualEmpNo;/个人编号 int grade;/级别 float accumPay;/月薪总额 static int employeeNo;/本公司职员编号目前最大值 public: employee( );/构造函数 employee( );/析构函数 virtual void pay( ) = 0;/计算月薪函数,纯虚函数 virtual void displayStatus( ) = 0;/显示人员信息 void promote( int );/升级函数 ;,公司管理系统实例,class technician:public employee /兼职技术人员类 private:

14、 float hourlyRate;/每小时酬金 int workHours;/当月工作时数 public: technician( );/构造函数 void pay( );/计算月薪函数 void displayStatus( );/显示人员信息 ;,前一页,下一页,class salesman:virtual public employee /兼职推销员类,使用虚基类 protected: float CommRate;/按销售额提取酬金的百分比 float sales;/当月销售额 public: salesman( );/构造函数 void pay( );/计算月薪函数 void displayStatus( );/显示人员信息 ;,前一页,下一页,class manager:virtual public employee/经理类 protected: float monthlyPay;/固定月薪数 public: manager( );/构造函数 void pay( );/计算月薪函数 void displayStatus( );/显示人员信息 ; class salesmanager : public manager, public sal

温馨提示

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

评论

0/150

提交评论