Download presentation
Presentation is loading. Please wait.
1
第7单元 面向过程编程—— 继承与多态
2
发展自链表,但具有了新的特性,数据与操作!
什么是继承? 发展自链表,但具有了新的特性,数据与操作! 回忆链队类 class SLListQueue { SLList LstQue; Node *front,*rear; public: SLListQueue(){front=rear=LstQue.head->link;} //构造函数 ~SLListQueue(){} //析构函数 bool IsEmpty(){ return Length()==0;} //队空否? void EnQue(const DataType &); //进队 DataType DeQue(); //出队 DataType GetFront(); //查看队头数据 void MakeEmpty(); //置空队列 };
3
第八章 继承与多态 现实世界的层次结构 现实世界的层次结构 类继承层次结构 学校在 册人员 学生 教职工 本科生 研究生 教师 行政 人员
第八章 继承与多态 现实世界的层次结构 现实世界的层次结构 类继承层次结构 学校在 册人员 学生 教职工 本科生 研究生 教师 行政 人员 工人 硕士生 博士生
4
继承(inheritance):类的衍生与发展
第八章 继承与多态 继承(inheritance):类的衍生与发展 允许在保持原有类特性的基础上进行扩展,增加功能,从而产生新类(派生类)。 (1) 继承是面向对象程序设计中代码复用的最重要手段; (2) 继承能设计实现层次化的面向对象程序。 多态性(polymorphism):操作的多义性 表现了不同层次的类间,以及同一类中,同名的成员函数之间的关系。分成两类: (1) 编译时多态性: 函数的重载,运算符的重载; (2) 运行时多态性: 以虚函数为基础,是面向对象程序设计的标志性特征。
5
【例8.1】由在册人员类公有派生学生类 class Person { string IdPerson; //身份证号,18位数字
string Name; //姓名 bool Sex; //性别 int Birthday; //格式1986年8月18日写作 string HomeAddress; //家庭地址 public: Person(string, string, Tsex, int, string); //构造函数 Person(); //默认的构造函数 ~Person(); //析构函数
6
【例8.1】由在册人员类公有派生学生类 //接口函数: void SetName(string); //修改名字
string GetName(){return Name;} //提取名字 void SetSex(Tsex sex){Sex=sex;} //修改性别 bool GetSex(){return Sex;} //提取性别 void SetId(string id){IdPerson=id;} //修改身份证号 string GetId(){return IdPerson;} //提取身份证号 void SetBirth(int birthday){Birthday=birthday;}//修改生日 int GetBirth(){return Birthday;} //提取生日 void SetHomeAdd(string ); //修改住址 string GetHomeAdd(){return HomeAddress;} //提取住址 void PrintInfo(); //打印个人信息 };
7
【例8.1】由在册人员类公有派生学生类 派生的学生类: class Student: public Person //定义派生的学生类 {
string NoStudent; //学号 course cs[30]; //30门课程与成绩 public: Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud); //派生类构造函数 Student(); //默认派生类构造函数 ~Student(); //派生类析构函数 SetCourse(string , int); //课程设置 int GetCourse(string ); //查找成绩 void PrintInfo(); //打印学生情况 }; struct course{ string coursename; int grade; };
8
第八章 继承与多态 8.1 继承与派生的概念 8.4 虚基类 (选读) 8.2 派生类的构造函数与析构函数 8.5 派生类应用讨论
第八章 继承与多态 8.1 继承与派生的概念 8.4 虚基类 (选读) 8.2 派生类的构造函数与析构函数 8.5 派生类应用讨论 8.3 多重继承与派生类成员标识(选读) 8. 6 多态性与虚函数
9
层次概念: 8.1 继承与派生的概念 层次概念是计算机的重要概念。通过继承(inheritance)的机制可对类(class)分层。
8.1 继承与派生的概念 层次概念: 层次概念是计算机的重要概念。通过继承(inheritance)的机制可对类(class)分层。 C++通过类派生(class derivation)的机制来支持继承。被继承的类称为基类(base class)或超类(superclass),新的类为派生类(derived class)或子类(subclass)。 基类和派生类的集合称作类继承层次结构(hierarchy)。 如果基类和派生类共享相同的公有接口,则派生类被称作基类的子类型(subtype)。 派生反映了事物之间的联系,事物的共性与个性之间的关系。 派生与独立设计若干相关的类相比,前者工作量少,重复部分可以从基类继承来,不需要单独编程。
10
8.1 继承与派生的概念 类的派生与继承 派生方式
11
8.1.1 类的派生与继承 派生类的定义: class 派生类名:访问限定符 基类名1《,访问限定符 基类名2,……,访问限定符 基类名n》
类的派生与继承 派生类的定义: class 派生类名:访问限定符 基类名1《,访问限定符 基类名2,……,访问限定符 基类名n》 { 《 《private: 》 成员表1;》 //派生类增加或替代的私有成员 《public: 成员表2;》 //派生类增加或替代的公有成员 《protected: 成员表3;》 //派生类增加或替代的保护成员 };//分号不可少 其中基类1,基类2,……是已声明的类。 在派生类定义的类体中给出的成员称为派生类成员,它们是新增加的成员,它们给派生类添加了不同于基类的新的属性和功能。派生类成员也包括取代基类成员的更新的成员。
12
单继承:派生类只有一个直接基类的情况称为单继承(single-inheritance)。
类的派生与继承 多重继承:如果一个派生类可以同时有多个基类,称为多重继承(multiple-inheritance),这时的派生类同时得到了多个已有类的特征。 单继承:派生类只有一个直接基类的情况称为单继承(single-inheritance)。 基类1 基类2 …… 基类n 基类 派生类1 派生类2 派生类1 派生类2 (a)多重继承 (b)单一继承 图8.1 多重继承与单一继承
13
类的派生与继承 层次化继承: 由基类派生出来的新类,同样可以作为基类再继续派生出更新的类,依此类推形成一个层次结构。直接参与派生出某类称为直接基类,而基类的基类,以及更深层的基类称为间接基类。 类族: 基类与其直接派生类、间接派生类,形成了一个相互关联的类的家族,称类族。如MFC就是这样的类族, 其中绝大多数类由CObject类派生出MFC类中的绝大多数。
14
8.1.1 类的派生与继承 派生类编写“四步曲”: Step 1. 吸收基类的成员 Step 2. 改造基类成员 Step 3. 发展新成员
类的派生与继承 派生类编写“四步曲”: Step 1. 吸收基类的成员 不论是数据成员,还是函数成员(除构造函数与析构函数)全盘接收 Step 2. 改造基类成员 声明和基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员,同名覆盖(override) Step 3. 发展新成员 声明与基类成员不同名的派生类新成员,应能体现出派生类在功能上的发展。 Step 4. 重写构造函数与析构函数
15
8.1.1 类的派生与继承 为什么? 继承方式(派生类型): 访问限制符号及其强弱?
类的派生与继承 第二步中,新成员如是同名成员函数,参数表也必须一样,否则是重载。 第三步中,独有的新成员才是继承与派生的核心特征。 第四步派生类不继承重写构造函数与析构函数,不管原来的函数是否可用一律重写可免出错。 为什么? 继承方式(派生类型): 指定了派生类对基类成员的访问限制: 公有(public)方式,亦称公有继承 保护(protected)方式,亦称保护继承 私有(private)方式, 亦称私有继承。 访问限制符号及其强弱?
16
(2)派生类之外对派生类中的基类成员的访问。
8.1.2 公有派生与私有派生 访问限定符两方面含义: (1)派生类成员函数对基类的成员的访问; (2)派生类之外对派生类中的基类成员的访问。 派生类对基类成员的访问 基类访问限制派生类型 public protected private V X
17
公有派生是绝对主流! 8.1.2 公有派生与私有派生 派生类外访问其基类的成员访问 基类访问限制 派生类型 public protected
private public(公有化) public V protected X private X protected(保护化) private (私有化) 公有派生是绝对主流!
Similar presentations