面向对象程序设计类的继承和派生5.15.3a_第1页
面向对象程序设计类的继承和派生5.15.3a_第2页
面向对象程序设计类的继承和派生5.15.3a_第3页
面向对象程序设计类的继承和派生5.15.3a_第4页
面向对象程序设计类的继承和派生5.15.3a_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、远离手机远离手机1 1小时小时面向对象程序的设计时时 间:星期五(间:星期五(1212讲)讲)地地 点:点:X2217(X2217(犀浦校区犀浦校区) ))任课教师:殷成凤任课教师:殷成凤QQQQ群(群(52777025845277702584)第第7 7章章 继承与派生继承与派生第7次 面向对象思想v 复习 友元v 类的继承与派生概念v 派生类的访问属性v 派生类的构造和析构函数继承的概念继承的概念 特殊类对象特殊类对象具有具有一般类对象一般类对象的的全部属性和行为全部属性和行为,称,称为特殊类对一般类的为特殊类对一般类的继承继承特殊类:特殊类: 父类父类一般类:子类一般类:子类5.1 类的

2、继承与派生概念5.1 类的继承与派生概念动物动物食草动物食草动物食肉动物食肉动物生活中继承的事例父类子类子类父类生活中继承的事例5.1 类的继承与派生概念父类父类子类子类学校员工学校员工教师、行政人员 后勤大学生大学生本科生 研究生 几何形状几何形状三角形、圆形交通工具交通工具汽车 船 实际问题:描述一个公司里的四类人员:管理人员、销售人员、技术人员。现在,需要存储这些人员的姓名、编号、级别、月薪、计算月薪总额并显示员工全部信息。对于这这三类人员信息的处理方法不完全相同(如月薪计算方法不同),因此不能用同一个类来描述,只能考虑设计三个类分别描述这三类人员。 5.1 类的继承与派生员工销售人员管

3、理人员技术人员 技术人员的描述:计算技术人员的月薪 技术人员类 成员变量: 姓名; 级别; 月薪; 成员函数: 计算月薪(工作时间) return 工作时间*工时单价; ;5.1 类的继承与派生销售人员的描述:计算技术人员的月薪销售人员类成员变量:姓名;级别;月薪;成员函数:计算月薪(当月销售额)return 当月销售额*提成率; 管理人员的描述:计算技术人员的月薪 管理人员类 成员变量: 姓名; 级别; 月薪; 成员函数: 计算月薪() return 固定月薪; ;5.1 类的继承与派生共同属性5.1 类的继承与派生员工的描述:共同属性的描述员工类成员变量:姓名;级别;月薪;管理人员类 继承

4、 员工计算月薪() return 固定月薪;销售人员类 继承 员工计算月薪(当月销售额)return 当月销售额*提成率;技术人员类 继承 员工计算月薪(工作时间) return 工作时间*工时单价;5.1 类的继承与派生员工销售人员管理人员技术人员父类的一般性特殊的计算月薪方式子类的特殊性子类具有父类一般特性(属性和方法),以及自身特殊的特性概念概念类的继承类的继承:是新的类从已有类那里得到已有的特性。:是新的类从已有类那里得到已有的特性。类的派生类的派生:从已有的类产生一个新类的过程。:从已有的类产生一个新类的过程。基类(父类)基类(父类):原有的类:原有的类派生类(子类)派生类(子类):

5、产生的新类。:产生的新类。派生类同样可以作为基类派生新的类,这样就形成了类的层次结构。类的派生实际是一种演化、发展过程,即通过扩展、更改和特殊化,从一个已知类出发建立一个新类。通过类的派生可以通过类的派生可以建立具有共同关键特征的对象家族,从而实现代码的重用建立具有共同关键特征的对象家族,从而实现代码的重用,这种继承和派生的机制对于已有程序的发展和改进极为有利。5.1 5.1 类的类的继承与派生继承与派生说明:说明:继承继承-是是特化类对泛化类(一般类)特化类对泛化类(一般类)而言而言派生派生-是是泛化类(一般类)对特化类泛化类(一般类)对特化类而言。而言。 泛化类也称为父类、基类、超类或祖先

6、类,特化类也称为子类或派生类。 从父类派生子类,只需要在子类中增加自己的特有成员,包括属性成员和方法成员。从子类中抽象父类,则需要抽取众多子类中的共性,丢弃各子类中的特有部分。5.1 类的继承与派生5.1 类的继承与派生继承的特点:继承的特点:1、具有层次结构2、子类继承了父类的属性和方法动物食草动物食肉动物5.1 类的继承与派生继承的优点:继承的优点:1、父类的属性和方法可用于子类2、可以轻松的定义之类3、代码可重用性4、代码的开发更加简单一、定义派生类的基本格式:一、定义派生类的基本格式:class class 派生类名:基类列表派生类名:基类列表 派生类成员声明派生类成员声明即成员表即成

7、员表 基类表包括:基类表包括:继承方式继承方式 基类名基类名1 1,继承方式继承方式 基类名基类名2 2,继承方式继承方式 基类名基类名n n5.1 类的继承与派生例如:设father1,father2为两个已有的类,下面声明一个从这两个基类派生出的类son1class son1:public father1,private father2 public:. private:;5.1 类的继承与派生二、单继承与多继承单继承:一个派生类只有一个直接基类的情况,称为单继承多继承:一个派生类同时有多个基类,称为多继承在派生过程中,派生出来的新类也同样可以作为基类再继续派生新的类,此外,一个基类可以同

8、时派生出多个派生类。即: 一个基类从父类继承来的特征可以被其他新的子类所继承 一个父类的特征,可以同时被多个子类继承这样,就形成了一个相互关联的类的家族,称为类族。 5.1 类的继承与派生多继承多继承单继承单继承5.1 5.1 类的类的继承与派生继承与派生三、派生类的生成过程分析派生新类这个过程,实际上是经历了三个步骤:吸收基类成员、改造基类成员、添加新的成员。面向对象的继承和派生机制,其最主要的目的是实现代码的重用和扩充。因此,吸收基类成员就是一个重用的过程,而对基类成员进行调整、改造以及添加新成员就是原有代码的扩充过程,二者是相辅相成。5.1 5.1 类的类的继承与派生继承与派生1、吸收基

9、类成员在C+的类继承中,第一步是将基类的成员全盘接收,这样,派生类实际上就包含了它所有基类中除构造和析构函数之外的所有成员。在派生过程中,构造函数和析构函数都不被继承。5.1 类的继承与派生2、改造基类成员对基类成员的改造包括两个方面:p 一个是基类成员的访问控制问题p 一个是对基类数据或函数成员的覆盖,就是在派生类中声明一个和基类数据或函数同名的成员。 同名覆盖:如果派生类声明了一个和基类成员同名的新成员(如果是成员函数,则函数表要相同,参数不同属于重载),派生的新成员就会覆盖外层同名的成员。这时1)在派生类中2)通过派生类的对象直接使用成员名就只能访问到派生类中声明的同名成员(而访问不到基

10、类中的同名成员),这称为同名覆盖。5.1 类的继承与派生3 3、添加新的成员、添加新的成员 派生类新成员的加入派生类新成员的加入是继承与派生机制的核心,是保证派是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。我们可以根据实际情况需要,生类在功能上有所发展的关键。我们可以根据实际情况需要,给给派生类添加适当的数据和函数成员派生类添加适当的数据和函数成员,来实现必要的新增功能,来实现必要的新增功能。 此外,由于基类的构造函数和析构函数不被继承,还需要此外,由于基类的构造函数和析构函数不被继承,还需要在在派生类中重新加入新的构造和析构函数派生类中重新加入新的构造和析构函数,例如:,例如:

11、5.1 类的继承与派生class Employeeprivate: string m_Name; int m_Age; int m_Year; string m_Depart;public:Employee()/构造函数构造函数Employee()/析构函数析构函数void insertInfo(string name,int age,int year,string department);/录入数据录入数据int getAge()return m_Age;void printOn();bool retire(); ;5.1 类的类的继承与派生继承与派生基类4个成员变量4个普通成员函数 cla

12、ss Manager:public Employeeprivate:string m_Level;public:Manager()/构造函数构造函数Manager()/析构函数析构函数void insertInfo(string name,int age,int year,string department,string level); ;5.1 类的类的继承与派生继承与派生吸收基类成员吸收基类成员:在类继在类继承中,第一步是将基承中,第一步是将基类成员全盘接收类成员全盘接收改造基类成员:同名覆盖改造基类成员:同名覆盖添加新的成员添加新的成员 派生类?个成员变量?个普通成员函数 5.1 类的类

13、的继承与派生继承与派生C+C+中的类与类的两种关系中的类与类的两种关系1、is a 【是一个是一个】2、has a 【有一个有一个】EmployeeManageris a基类派生类Point p1LinePoint p2has a一、继承方式一、继承方式继承方式:规定继承方式:规定如何访问从基类继承的成员如何访问从基类继承的成员。即指。即指定了派生类成员以及类外对象对于从基类继承来的成定了派生类成员以及类外对象对于从基类继承来的成员的员的访问权限访问权限。派生类成员:指除了从基类继承来的所有成员外,派生类成员:指除了从基类继承来的所有成员外,新增加的数据和函数成员新增加的数据和函数成员继承方式

14、有三种,关键字为:继承方式有三种,关键字为:u class Aclass A:publicpublic B B(公有继承)(公有继承)u class Aclass A: protectedprotected B B(保护继承)(保护继承)u class Aclass A: privateprivate B B(私有继承)(私有继承)5.2 派生类的访问属性派生类的访问属性说明:说明: 在派生类的声明中,在派生类的声明中,每一个每一个“继承方式继承方式”只限只限定紧随其后的基类定紧随其后的基类,所以多继承时,每个基类都要,所以多继承时,每个基类都要指定一种继承方式指定一种继承方式 如果没有显式给

15、出继承方式,系统如果没有显式给出继承方式,系统默认为私有默认为私有继承方式继承方式。7.1 类的继承与派生(续10) 5.2 5.2 派生类的访问属性派生类的访问属性 基类的成员有三种访问属性1、public、2、protected3、private基类的自身成员可以对基类中任何一个其他成员进行访问,但是通过基类的对象,就只能访问到该类的公有成员class Employeepublic: string m_Name; int m_Age; void printOn();bool retire(); ;class Manager:public Employeeprivate:string m_L

16、evel;public:void printOn_m();1、公有继承:public访问限定符5.2 派生类的访问属性Public:string m_Name;int m_Age; void printOn();bool retire();public继承int main()Manager m;m.m_Age=45;m.printOn();m.retire();1、公有继承:public访问限定符5.2 派生类的访问属性派生类的访问属性1、公有继承:protected访问限定符class Employeeprotected: string m_Name; int m_Age; public:v

17、oid printOn();bool retire(); ;class Manager:public Employeeprivate:string m_Level;public:void printOn_m();5.2 派生类的访问属性派生类的访问属性protected: string m_Name; int m_Age; public:void printOn();bool retire();public继承int main()Manager m;m.m_Age=45;/不可访问不可访问m.printOn();m.retire();class Manager:public Employeep

18、rivate:string m_Level;protected:string m_Name; int m_Age; public:void printOn_m() m_Age=45;;void printOn();bool retire(); ;5.2 派生类的访问属性派生类的访问属性1、公有继承:protected访问限定符protected: string m_Name; int m_Age; public:void printOn();bool retire();public继承class Manager:public Employeeprivate:string m_Level;pub

19、lic:void printOn_m() m_Age=45;;public:void printOn();bool retire();1、公有继承:private 访问限定符class Employeeprivateprivate : string m_Name; int m_Age; public:void printOn();bool retire(); ;5.2 派生类的访问属性派生类的访问属性不可见公有成员不可访问基 类派 生 类受保护成员 一、公有继承一、公有继承 class Aclass A:public public B B(公有继承)(公有继承)5.2 派生类的访问属性派生类的

20、访问属性受保护成员公有成员私有成员基类的公有和保护成员的访问属性在派生类中保持不变,而基类的私有成员不可访问。1. 基类的公有成员和保护成员被继承到派生类中仍然作为派生类的公有成员和保护成员,派生类的其他成员可以直接访问它们。2. 其他外部使用者能通过派生类的对象访问继承来的公有成员3. 但不论是派生类的成员还是对象都无法访问基类的私有成员。5.2 派生类的访问属性派生类的访问属性二、保护继方式class Manager: protected Employee即:1.派生类的其他成员可以直接访问从基类继承来的公有和保护成员,2.而其他外部使用者无法通过派生类的对象访问到它们,3.但不论派生类的

21、成员还是对象都无法访问基类的私有成员。 公有成员受保护成员受保护成员私有成员不可访问基 类派 生 类5.2 派生类的访问属性派生类的访问属性三、私有继承三、私有继承class Manager: private Employee通过在基类表中通过在基类表中去掉去掉publicpublic或者通过显式地声明或者通过显式地声明privateprivate,可以私有,可以私有地继承基类。地继承基类。 即:即:1 1、基类的公有成员和保护基类的公有成员和保护成员成员被继承后作为被继承后作为派生类的私有成员派生类的私有成员,2 2、派生类的其他成员可以直接访问它们,而其他外部使用者派生类的其他成员可以直接

22、访问它们,而其他外部使用者无法通过无法通过派生类的对象访问派生类的对象访问到它们。到它们。3 3、但不论是派生类的成员还是对象都但不论是派生类的成员还是对象都无法访问基类的私有成员无法访问基类的私有成员。公有成员公有成员受保护成员受保护成员私有成员私有成员私有成员私有成员不可访问不可访问基 类派 生 类5.2 派生类的访问属性派生类的访问属性四、私有继承与组合派生类私有继承基类一般是为了使用基类的功能来实现它自己的功能,私有继承是组合的一种语法上的变形(聚合或者“有一个”)。class Enginepublic:Engine(int Cylinders);void start(); / 发动引

23、擎发动引擎;class Carpublic:Car() : e(8) / 初始化汽车引擎是初始化汽车引擎是8缸缸void start() e_.start(); / 通过发动通过发动引擎来发动汽车引擎来发动汽车private:Engine e; / Car has-a Engine;5.2 派生类的访问属性派生类的访问属性同样的“has a”关系也能用私有继承表示: class Car:private Engine / Car has-a Engine public:Car() : Engine(8) / 初始化汽车引擎是初始化汽车引擎是8缸的缸的using Engine:start; / 通

24、过发动引擎来发动汽车通过发动引擎来发动汽车;四、私有继承与组合5.2 派生类的访问属性派生类的访问属性一、派生类的构造函数派生类对象-包含 基类对象执行派生类构造函数之前, 先执行基类的构造函数 派生类交代 基类初始化, 具体形式:构造函数名(形参表): 基类名(基类构造函数实参表)25.3 5.3 派生类的构造和析构函数派生类的构造和析构函数一、派生类的构造函数class B1public:B1(int i) /有参构造函数有参构造函数cout构造构造B1 iendl; ;class B2public:B2(int j) /有参构造函数有参构造函数cout“构造构造B2 ”jendl;cla

25、ss B3public:B3()() /无参构造函数无参构造函数cout“构造构造B3 ” endl; 一、派生类的构造函数class C:public B1,public B3,public B2 /三个基类三个基类public:C(int a,int b,int c,int d) :B1(c),B2(b);int main()C obj(1,2,3,4); return 0;构造 B1 3构造 B3构造 B2 2初始化列表在 创建 派生类的对象 时, 需要调用基类的构造函数: 初始化派生类对象中从基类继承的成员 在执行一个派生类的构造函数之前,总是先执行基类的构造函数 基类数据成员 基类构

26、造函数完成派生类构造函数完成派生类调用基类构造函数的两种方式调用基类构造函数的两种方式显式方式显式方式:派生类的构造函派生类的构造函数中数中 基类的构造函数提基类的构造函数提供供参数参数派生类:派生类(形参数列表):基类(基类参数列表)隐式方式隐式方式:1、派生类的派生类的构造函数构造函数中中, 省略基类构造函数省略基类构造函数时时,派生类的构派生类的构造造函数函数, 自动调用基类的默认构造函数 2、派生类的派生类的析构函数被执析构函数被执行行时时, 执行完执行完派生类的析构函数派生类的析构函数后后, 自动自动调用调用基类的析基类的析构构函数函数5.3 5.3 派生类的构造和析构函数派生类的构

27、造和析构函数class Base public:int n;Base(int i):n(i) cout 基类基类 n 构造构造 endl;Base() cout 基类基类 n 析构析构 endl;class Derived:public Base public:Derived(int i):Base(i)cout 派生类派生类构造构造 endl;Derived()cout “派生类析构派生类析构” endl;int main()Derived Obj(3); return 0;8基类派生类输出结输出结果果:基类基类 3 构造构造派生类构造派生类构造派生类派生类析构析构基类基类 3析构析构派生类和成员对象10class Apublic: A (int i) x = i; cout“A构造构造endl; A() cout“A 析构析构endl; int getX() return x; private: int x;表达式中可以出现: FlyBug构造函数的参数, 常量5.3 5.3 派生类的构造和析构函数派生类的构造和析构函数 class B public: B(int i

温馨提示

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

评论

0/150

提交评论