21天学通C++-第十一章-继承

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

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

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功