c++电子课件(下)第八章

上传人:aa****6 文档编号:51475042 上传时间:2018-08-14 格式:PPT 页数:116 大小:698.50KB
返回 下载 相关 举报
c++电子课件(下)第八章_第1页
第1页 / 共116页
c++电子课件(下)第八章_第2页
第2页 / 共116页
c++电子课件(下)第八章_第3页
第3页 / 共116页
c++电子课件(下)第八章_第4页
第4页 / 共116页
c++电子课件(下)第八章_第5页
第5页 / 共116页
点击查看更多>>
资源描述

《c++电子课件(下)第八章》由会员分享,可在线阅读,更多相关《c++电子课件(下)第八章(116页珍藏版)》请在金锄头文库上搜索。

1、继承(inheritance): 该机制是面向对象程序设计使代码可以复用的最重要的手 段,它允许程序员在保持原有类特性的基础上进行扩展, 增加功能。这样产生新的类,称派生类。继承呈现了面向 对象程序设计的层次结构。体现了由简单到复杂的认识过 程。第八章 继承与多态多态性(polymorphism): 多态性包括静态的多态性和动态的多态性。前者亦称编译 时的多态性,包括函数的重载和运算符的重载。后者亦称 运行时的多态性,这是以虚函数为基础的,是面向对象程 序设计的标志性特征。 体现了类推和比喻的思想方法。 第八章 继承与多态8.1 继承与派生的概念 8.4 虚基类 (选读) 8.3 多重继承与派

2、生类成员标识 (选读) 8. 6 多态性与虚函数 8.5 派生类应用讨论 8.2 派生类的构造函数与析构函数 附录: UML类图中的依赖关系附录:用UML类图表示派生8.1 继承与派生的概念层次概念是计算机的重要概念。通过继承(inheritance) 的机制可对类(class)分层,提供类型/子类型的关系。C+通过类派生(class derivation)的机制来支持继承。 被继承的类称为基类(base class)或超类(superclass), 新的类为派生类(derived class)或子类(subclass)。基 类和派生类的集合称作类继承层次结构(hierarchy)。如果基类和

3、派生类共享相同的公有接口,则派生类被称作 基类的子类型(subtype)。 层次概念:派生反映了事物之间的联系,事物的共性与个性之间的关系 。 派生与独立设计若干相关的类,前者工作量少,重复的部 分可以从基类继承来,不需要单独编程。 8.1 继承与派生的概念8.1.1 类的派生与继承 8. 1.2 公有派生与私有派生 派生类的定义: class 派生类名:访问限定符 基类名1,访问限定符 基类名2,访问限定符 基类名n private: 成员表1; /派生类增加或替代的私有成员 public: 成员表2; /派生类增加或替代的公有成员 protected: 成员表3; /派生类增加或替代的保护

4、成员 ;/分号不可少其中基类1,基类2,是已声明的类。 在派生类定义的类体中 给出的成员称为派生类成员,它们是新增加成员,它们给派生类 添加了不同于基类的新的属性和功能。派生类成员也包括取代基 类成员的更新成员。8.1.1 类的派生与继承8.1.1 类的派生与继承访问限定符两方面含义:派生类成员(新增 成员)函数对基类(继承来的)成员的访问(调用 和操作),和从派生类对象之外对派生类对象中的 基类成员的访问。放在后面讨论。 公有派生限制最少,是派生的主流。访问限定符: 基类名前的访问限定符,是对基类成员进一步的限制 。访问控制也是三种: 公有(public)方式,亦称公有继承 保护(prote

5、cted)方式,亦称保护继承 私有(private)方式, 亦称私有继承。 基类1基类2基类n派生类1派生类2基类派生类1派生类2(a)多重继承 (b)单继承 图8.1 多重继承与单继承 一个基类 可以直接 派生出多 个派生类 派生类可 以由多个 基类共同 派生出来 ,称多重 继承。8.1.1 类的派生与继承 多重继承:如果一个派生类可以同时有多个基类,称 为多重继承(multiple-inheritance),这时的派生类同 时得到了多个已有类的特征。 单继承:派生类只有一个直接基类的情况称为单继承( single-inheritance)。8.1.1 类的派生与继承在派生过程中,派生出来的

6、新类同样可以 作为基类再继续派生出更新的类,依此类推形 成一个层次结构。直接参与派生出某类称为直 接基类,而基类的基类,以及更深层的基类称 为间接基类。 类族:同时一个基类可以直接派生出多个派生类 。这样形成了一个相互关联的类族。如MFC就 是这样的族类,它由一个CObject类派生出200 个MFC类中的绝大多数。 多层次继承:编制 派生 类时 可分 四步 吸收基类的成员 改造基类成员 发展新成员 重写构造函数与析构函数 8.1.1 类的派生与继承不论是数据成员,还是函数成员, 除构造函数与析构函数外全盘接收 声明一个和某基类成员同名的新成员,派 生类中的新成员就屏蔽了基类同名成员派生类新成

7、员必须与基类成员不同名,它 的加入保证派生类在功能上有所发展。 派生编程步骤:8.1.1 类的派生与继承第二步中,新成员如是成员函数,参数表和返 回值也完全一样,称为同名覆盖(Override),否则是重载 。第三步中,独有的新成员才是继承与派生的核 心特征。第四步是重写构造函数与析构函数,派生类不 继承这两种函数。不管原来的函数是否可用一 律重写可免出错。方式类似聚合含成员对象的类的构造函数。详细内容后文讨论。【例8.1】由在册人员类公有派生学生类【例8.1】由在册人员类公有派生学生类。我 们希望基类和派生类共享相同的公有接口,只 能采用公有派生来实现。基类: class Person st

8、ring IdPerson;/身份证号,18位数字 string Name;/姓名 Tsex Sex; /性别enum Tsexmid,man,woman; int Birthday;/生日,格式1986年8月18日写作19860818 string HomeAddress;/家庭地址public: Person(string, string,Tsex,int, string);/构造函数Person(); /默认的构造函数Person(); /析构函数【例8.1】由在册人员类公有派生学生类void SetName(string); /修改名字 string GetName()return N

9、ame; /提取名字 void SetSex(Tsex sex)Sex=sex; /修改性别 Tsex 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()re

10、turn HomeAddress; /提取住址 void PrintPersonInfo(); /输出个人信息 ;/接口函数:【例8.1】由在册人员类公有派生学生类 派生的学生类: class Student:public Person /定义派生的学生类string NoStudent; /学号course cs30; /30门课程与成绩 public:Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud); /注意派生类构造函数声明方式Student(); /默认派生类构造函数

11、Student(); /派生类析构函数SetCourse(string ,int); /课程设置int GetCourse(string ); /查找成绩void PrintStudentInfo(); /打印学生情况 ;struct coursestring coursename;int grade;验证主函数8.2 派生类的构造函数与析构函数注意:本例中标准C+字符串string是作为成员对象使用的( 聚合),动态内存分配的构造和析构被封装起来,使用十分 简单。如使用动态生成的C风格字符串,要考虑深复制,那 要复杂得多。提倡完善的类对象封装,不仅封装数据和对数据的操作 ,而且封装资源的动态

12、分配与释放,形成一个完备的子系统 。在一个有层次结构的类体系中资源的动态分配与释放应封 装在成员对象中,如同使用标准的string字符串类那样。聚合是一种完善的封装。采用成员对象将大大简化层次 结构的类体系中资源的动态分配与释放的处理方法,不再出 现难度极大的多层次的深复制。8.1.2 公有派生与私有派生访问限定符讨论: 派生类成员(新增成员)函数对基类(继承来 的)成员的访问(调用和操作),和从派生 类对象之外对派生类对象中的基类成员的访 问。 下面进行详细讨论:8.1.2 公有派生与私有派生不可直接访问 不可直接访 问 private 不可直接访问 private protected 不可

13、直接访问 private public 私有派生所有接口 必须重写 不可直接访问 不可直接访 问 private 不可直接访问 protected protected 可直接访问 public public 公有派生所有接口 均可使用 在派生类对象 外访问派生类 对象的基类成 员 在派生类中 对基类成员 的访问限定 基类中的 访问限定 派生方式 公有派生是绝对主流。 8.1.2 公有派生与私有派生保护派生: 直接派生: 基类的私有成员仍是派生类的私有成员,不 可直接访问,而基类中的公有和保护成员全部成为派生类 的保护成员,在派生类中可以直接访问。但在派生类对象 之外是不能直接访问该对象的任何基

14、类成员的。与私有派 生相同。 多层派生:把保护派生类作为基类或把私有派生类作为 基类再作一层保护派生。在新的保护派生类中可直接访问 由保护派生传递过来的底层基类的公有和保护成员,而不 可直接访问由私有派生传递来的底层基类的公有和保护成 员。但在该类对象之外都不可直接访问类对象底层基类的 公有成员。合理使用保护限定方式可以在复杂的类层次关 系中取一个共享访问和成员封装隐蔽性的折衷。派生类构造函数的定义: 派生类名:派生类名(参数总表):基类名1(参数名表1) ,基类名2(参数名表2),基类名n(参数名表n ),成员对象名1(成员对象参数名表1),成 员对象名m(成员对象参数名表m) /派生类新增

15、成员的初始化; /所列出的成员对象名全部为新增成员对象的名字注意:在构造函数的声明中,冒号及冒号以后部分必须略去。所谓不能继承并不是不能利用,而是把基类的构造函数作 为新的构造函数的一部分,或者讲调用基类的构造函数。基 类名仅指直接基类,写了底层基类,编译器认为出错。冒号后的基类名,成员对象名的次序可以随意,这里的次 序与调用次序无关。 8.2 派生类的构造函数与析构函数派生类构造函数各部分执行次序: 1.调用基类构造函数,按它们在派生类定义 的先后顺序,顺序调用。 2.调用成员对象的构造函数,按它们在类定 义中声明的先后顺序,顺序调用。 3.派生类的构造函数体中的操作。8.2 派生类的构造函数与析构函数注意:在派生类构造函数中,只要基类不是使用无参的默认 构造函数都要显式给出基类名和参数表。如果基类没有定义构造函数,则派生类也可以不定义 ,全部采用系统给定的默认构造函数。如果基类定义了带有形参表的构造函数时,派生类就 应当定义构造函数。8.2 派生类的构造函数与析构函数析构函数:析构函数的功能是作善后工作。只要在函数体内把派生类新增的一般成员处理 好就可以了,而对新增的成员对象和基类的善后工

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号