- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章:继承性和多态性 第1部分继承与派生 继承的概念与派生的定义 派生类的继承方式 派生类的构造和析构函数 多重继承 基类和派生类的转换 1. 继承的概念和派生类的定义 继承和派生的基本概念: 继承性是面向对象程序设计的重要特性之一,C++程序的可重用性是通过继承机制来实现的。 继承在概念上将具有从属关系的类连接起来,便于描述现实实体的层次关系。 在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。 派生类继承了基类(父类)的所有数据成员和成员函数,并可以对成员作必要的增加或调整。 基类和派生类是相对而言的,形成类的继承层次结构: ① 父类可以派生出多个子类。 ② 子类又可以作为父类,再派生出新的派生类。 ③ 所有的子孙后代都继承了祖辈的基本特征,同时又有区别和发展。 单继承:一个派生类只继承一个基类,这种继承关系所形成的层次是一个树形结构。 多继承:一个派生类继承两个或多个基类。 派生类的定义方法: 前例中,已声明过一个基类Student,在此基础上通过单继承建立一个派生类Student1。 派生类的构成: 派生类成员有两部分:一是从基类继承过来的成员,体现共性;二是自己增加的成员,体现个性。 构造一个派生类包括以下3部分工作: ① 不可选择地从父类接收全部成员(构造和析构函数除外)。 缺陷:数据冗余、空间浪费和效率降低。这在目前C++中无法解决。 解决:在设计基类时要充分考虑到派生类的需要。(事实上有些类是专门作为基类而设计的) ② 调整从基类接收的成员: 方法一:改变基类成员在派生类中的访问属性——通过指定继承方式来实现。 方法二:在派生类声明同名成员——覆盖基类成员。!!注意,对于成员函数,不仅要同名还要参数个数和类型都相同。(请问,这是为什么?) ③ 在声明派生类时增加成员: 体现派生类对基类功能的扩展,同时定义自己的构造和析构函数,这需要精心设计。 程序5-1:CPoint类及其派生类CRect 派生类成员的访问属性: 派生类具有两部分成员,且不是简单直接继承,因而其访问属性势必复杂。 ﹡可以知道:一个成员在不同派生层次中的访问属性可能是不同的,它与继承方式有关。 分析上表: ①基类中的私有成员在派生类中均为不可访问。 ②其他成员总是在自身访问属性和继承方式中选择较严格者作为派生类中成员的访问属性。 比较私有继承和保护继承: ①在直接派生类中的实际作用是相同的,即在类外都不能访问,类中的成员函数可以访问。 ②在新的派生类中的作用不同,即原来私有基类中的成员在新类中都不能访问,原来保护基类中的成员可以在新类中被访问。 由此看出: ①公有继承是一种可持续式的继承; 注意:欲在派生类中引用的基类成员,不要声明为私有属性。 ②私有继承是一种绝断式的继承; 注意:再次派生将变得没有意义。 ③保护继承是一种隔绝式的继承; 注意:类外不能访问该派生类中的任何成员(包括成员函数)。 ④派生类成员有4种访问属性,如下: 3.派生类的构造函数和析构函数: 派生类构造函数: 定义原则:除了对派生类数据成员初始化外,还要对基类的数据成员初始化。 解决思路:执行派生类构造函数时,调用基类构造函数(基类构造函数不能被继承)。 派生类构造函数的一般形式: 派生类构造函数名(总参数列表): 基类构造函数名(参数表) { 派生类中新增数据成员初始化语句} 2点说明: ①(总参数列表)为派生类构造函数定义的形参,需要参数类型说明; ②(参数表)为调用基类构造函数传递的实参,不需要说明参数类型; 请看派生类Student1的构造函数: Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) { age=a; addr=ad;} 可以写成: Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s),age(a),addr(ad){}; 派生类构造函数的特殊形式: ① 当不需要对派生类新增成员初始化时,派生类构造函数体可以为空,而构造函数仅仅用于完成向基类构造函数传递参数的任务。 Student1(int n,string nam,char s):Student(n,nam,s){} ② 如果基类中没有定义构造函数,或只定义了不带参数或带缺省参数的构造函数,则派生类构造函数中可以不写基
文档评论(0)