21天学通C++-第十一章-继承_第1页
21天学通C++-第十一章-继承_第2页
21天学通C++-第十一章-继承_第3页
21天学通C++-第十一章-继承_第4页
21天学通C++-第十一章-继承_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第十一讲:继承,杨章伟e-mail:jtclass,课程内容安排,继承与派生访问控制派生类的构造和析构函数多重继承虚基类综合练习思考和习题,继承与派生,继承是面向对象的一块基石,其允许创建分等级层次的类。利用继承可以创建一个通用的类,然后再由更具体的类来继承他,再在这些类里加入自己新的成员。继承是面向对象的一个重要特征。根据派生类所拥有的基类数目不同,可以分为单继承和多继承。一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承,如图11-1所示。,声明派生类,类和类之间通过概括和特化,形成了层次关系。上层比下层更普遍更一般,下层比上层更具体更特殊。上层从下层抽象而来,下层继承上层的特性,也有与上层的差异。上层的类称为父类、超类或基类,下层的类称为子类或派生类。描述类的层次性的机制是继承,继承的过程称为派生。,声明派生类,通过前面的介绍,读者已经知道了,对于已有的类称为基类,由基类继承而来的类称为派生类。而派生类定义的一般形式是:class:派生类成员声明;,例如,下列语句声明了两个类A和B,其中类A作为基类,类B公有继承类A,也即类B为类A的派生类。classAprivate:ints;public:voidinits(intn);classB:publicA/类A以公有继承的方式派生类Bprivate:intt;public:voidinitt(intn);,访问控制,类的继承方式有公有继承public、保护继承protected和私有继承private三种,不同的继承方式,导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。总的来说,派生类对基类成员的访问能力如表11-1所示。,公有继承,在公有继承中,基类成员的可访问性在派生类中保持不变,即基类的私有成员在派生类中还是私有成员,不允许外部函数和派生类的成员函数直接访问,但可以通过基类的公有成员函数访问。基类的公有成员和保护成员在派生类中仍是公有成员和保护成员,派生类的成员函数可直接访问它们,而外部函数只能通过派生类的对象间接访问它们。,私有派生,在私有派生中,派生类只能以私有方式继承基类的公有成员和保护成员,因此,基类的公有成员和保护成员在派生类中成为私有成员,它们能被派生类的成员函数直接访问,但不能被类外函数访问,也不能在类外通过派生类的对象访问。另外,基类的私有成员派生类仍不能被访问。提示:在设计基类时,通常都要为其私有成员提供公有的成员函数,以便派生类和外部函数能间接访问它们。,保护继承,不论是公有派生还是私有派生,派生类都不能访问他的基类的私有成员,要想访问,只能通过调用基类成员函数的方式来实现,也就是使用基类提供的接口来访问。这对于频繁访问基类私有成员的派生类而言,很不方便。为此,C+提供了具有另一种访问特性的成员即保护(protected)成员。保护成员可被本类或派生类的成员函数访问,但不能被外部函数访问。为便于派生类的访问,可将基类中的需要提供给派生类访问的私有成员定义为保护成员。,派生类的构造函数,派生类的数据成员有所有基类的数据成员和派生类新增的数据成员共同组成,如果派生类新增成员中还有对象成员,派生类的数据成员中还间接含有这些对象的数据成员。因此,派生类对象的初始化,就要对基类数据成员、新增数据成员和对象成员的数据进行初始化。这样,派生类的构造函数需要以合适的初值作为参数,隐含调用基类的构造函数和新增对象成员的构造函数来初始化各自的数据成员,再用新加的语句对新增数据成员进行初始化。派生类构造函数声明的一般形式为:(参数总表):基类名(参数表),对象成员名1(参数表1),对象成员名n(参数表n)/派生类新增成员的初始化语句,派生类的析构函数,派生类析构函数的功能与基类析构函数的功能一样,也是在对象撤销时进行必需的清理善后工作。析构函数不能被继承,如果需要,则要在派生类中重新定义。跟基类的析构函数一样,派生类的析构函数也没有数据类型和参数。派生类析构函数的定义的方法与基类的析构函数的定义方法完全相同,而函数体只需完成对新增成员的清理和善后就行了,基类和对象成员的清理和善后工作,编译系统会自动调用其各自的析构函数来完成。,多重继承,当一个派生类具有多个基类时,称这种派生为多重继承或多基派生。多种继承中的主要问题是标识不唯一。比如,在派生类继承的这多个基类中有同名成员时,派生类中就会出现来自不同基类的同名成员,就出现了标识不唯一或二义性的情况,这在程序中是不允许的。,声明多重继承,多重继承就是一个派生类具有多个基类,这种情况在现实生活中也是常见。比如,海洋中的鲸鱼既有哺乳动物的特征,也有鱼的特征,如下图11-10所示。,声明多重继承,C+中,多重继承声明的一般形式为:class:,派生类成员声明;其中,冒号后面的部分称为基类表,之间用逗号分开。派生方式规定了派生类以何种方式继承基类成员,仍为private、protected和public三类。在具体的程序中使用多重继承时应注意如下两个事项:多重继承中,各种派生方式对于基类成员在派生类中的访问权限与单继承的规则相同。在使用多继承时,对基类成员的访问应无二义性,如果有,则应使用上节介绍的方法加以解决。,友元类,当一个类作为另一个类的友元时,称这个类为友元类。当一个类成为另一个类的友元类时,这个类的所有成员函数都成为另一个类的友元函数,因此,友元类中的所有成员函数都可以通过对象名直接访问另一个类中的私有成员,从而实现了不同类之间的数据共享。C+中,友元类的声明可以放在类声明中的任何位置,这时,友元类中的所有成员函数都成为友元函数。友元类声明的一般形式如下:firiendclass;或firiend;,多重继承的构造函数和析构函数,与普通继承类似的,多重继承时,也涉及到基类成员、对象成员和派生类成员的初始化问题,因此,必要时也要定义构造函数和析构函数。一般来说,C+中声明多继承构造函数的一般形式为:(参数总表)::基类名1(参数表1),基类名n(参数表n),对象成员名1(对象成员参数表1),对象成员名m(对象成员参数表m)/派生类新增成员的初始化语句,虚基类,多重继承中,要引用派生类的成员时,先是在派生类自身的作用域内寻找,如果找不到,再到基类中寻找,这时,如果这些基类又有一个共同的基类,派生类访问这个公共的成员时,就有可能由于同名成员的问题而发生二义性,此时就需要使用到本节要介绍的虚基类。引入需基类的主要原因是为了解决上面提到的基类中由于同名成员的问题而产生的二义性问题。,定义虚基类,虚基类的声明是在派生类的声明过程中进行的,其声明的一般形式为:class:virtual虚基类关键字的作用范围和派生方式与一般派生类的生命一样,只对紧跟其后的基类起作用。声明了虚基类以后,虚基类的成员在进一步派生过程中和派生类一起维护同一个内存拷贝。,虚基类的构造函数和初始化,虚基类的初始化与一般的多继承的初始化在语法上是一样的,但构造函数的执行顺序不同:虚基类的构造函数的执行在非虚基类的构造函数之前。若同一层次中包含多个虚基类,这些虚基类的构造函数按对他们说明的先后次序执行。若虚基类由非虚基类派生而来,则仍然先执行基类的构造函数,再执行派生类的构造函数。,综合练习,该范例定义了一个日期类Date类和一个时间类Time,由这两个类派生出日期时间类TimeDate。在创建对象时将指定的日期时间调用不同类的成员函数进行输出。,思考和习题,类的继承方式有公有继承public、保护继承protected和私有继承private三种,不同的继承方式,导致原来具有不同访问属性的基类成员在派生类中的访问属性不同,其如何变化?当一个派

温馨提示

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

最新文档

评论

0/150

提交评论