




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章继承与派生类,7.1基本概念7.2派生类的三种继承方式*7.3多重继承与虚基类习题,1,7.1基本概念,1、继承与派生继承是面向对象语言提供的一个重要机制,它在类与类之间建立了层次关系。首先从下面的实例当中体会继承的概念。classBoxprivate:intwidth,height;public:voidSetWidth(intw)width=w;voidSetHeight(inth)height=h;,2,classColorBoxprivate:intwidth,height;intcolor;public:voidSetWidth(intw)width=w;voidSetHeight(inth)height=h;voidSetColor(intc)color=c;,3,从上述代码可以看出,类ColorBox具有类Box的所有数据成员和成员函数,还用自己特有的color数据成员和SetColor成员函数。换句话说,彩色盒子是一种盒子,它具有普通盒子的特征,同时又具有自己独特的一面。既然ColorBox具有了Box的所有成员,能不能在定义ColorBox是不写出Box的成员,而直接引用过来呢?classBoxprivate:intwidth,height;public:voidSetWidth(intw)width=w;voidSetHeight(inth)height=h;/同上,4,classColorBox:publicBoxprivate:intcolor;public:voidSetColor(intc)color=c;说明:(1)classColorBox:publicBox表示类ColorBox是从类Box共有派生出来的,它告诉编译器类ColorBox继承了Box的所有成员。,5,继承,就是新的类从已有类那里得到已有的特性。从另一个角度来看,从已有类产生新类的过程就是类的派生。已有的类称为基类或父类,产生的新类称为派生类或子类。派生类同样也可以作为基类再派生新的类,这样就形成了类的层次结构。类的继承和派生的层次结构,可以说是人们对自然界中的事物进行分类、分析和认识的过程在程序设计中的体现。现实世界中的事物都是相互联系、相互作用的,人们在认识过程中,根据事物的实际特征,抓住其共同特性和细小差别,利用分类的方法进行分析和描述。,6,7,2、单一继承和多重继承单一继承中派生类只能有一个基类,多重继承中派生类可以有多个直接基类。,7.1多重继承,8,7.2派生类的三种继承方式类派生的基本形式为:class派生类名:访问控制符基类名;访问控制符可以是:private,public,protected,分别表示私有派生,公有派生,保护派生。如果不写明访问控制符,即缺省的情况下,如果基类是类定义的,那么默认为私有派生;如果是struct或union定义的,则为公有派生。在实际应用当中用的最多的是共有派生。,9,1、公有派生在公有派生中基类的私有成员将称为派生类的不可访问成员,基类的公有成员将称为派生类的公有成员。什么是不可访问成员?它是比私有成员访问还严格的成员。在派生类中不能通过派生类的对象访问基类的私有成员。看下面的例子:classBox;/同上classColorBox:publicBox;/同上,10,voidmain()ColorBoxob1;ob1.SetWidth(1);ob1.SetHeight(2);ob1.SetColor(3);ColorBoxob2;ob2.Width=1;/非法ob2.color=3;/如果在ColorBox内有另外一个成员函数,它能否访问width和height?,11,*2、私有派生在私有派生中,基类的私有成员成为派生类的不可访问成员,基类的公有成员成为派生类的私有成员。在派生类的成员函数中访问基类成员应遵守以下原则:无论是公有派生还是私有派生,在派生类的成员函数中都不能访问基类当中的私有成员。无论是公有派生还是私有派生,在派生类的成员函数中都可以访问基类的公有成员。,12,3、保护成员用protected说明的成员称为保护成员,保护成员的访问权限介于私有和公有之间。其规则为:派生类的成员函数可以访问基类的保护成员,但是在基类和派生类之外,程序不能访问类的保护成员。classBoxprotected:intwidth,height;,13,classColorBox:publicBoxprivate:intcolor;public:voidShow()coutwidthheightcolorendl;/派生类的成员函数可以访问基类的保护成员voidSetColor(intc)color=c;,14,voidmain()Boxob1;ob1.width=10;/,不可访问ColorBoxob2;ob2.width=20;/,不可访问说明:在公有派生的情况下,基类的保护成员将成为派生类的保护成员,在私有派生的情况下,基类的保护成员将成为派生类的私有成员。,15,4、访问权限的继承在一个类中访问权限可以有四种:不可访问,私有,保护,公有的。访问权限的含义:,16,访问权限的继承:,17,5、公有派生的性质:派生类都是基类成员和自身成员的集合,在内存中派生类对象的成员主要有两部分组成,前一部分是它从基类继承过来的成员,后一部分是派生类自身的成员。这种布局使得公有派生类对象可用于基类适用的任何地方。ColorBoxchild;Boxparent;parent=child;,7.2对象模型图,18,此外,下面的代码也是成立的:ColorBoxchild;Box*ptrParent;ptrParent=,图7.3,19,6、派生类的构造函数和析构函数前面提到,派生类继承了基类的成员,在内存中一个派生类对象包括两部分:基类成员和派生类自身的成员。如果创建了一个派生类对象,那么对象当中的基类成员由谁来初始化呢?很显然,基类的构造函数,所以当创建一个派生类对象时既要调用派生类的构造函数,又要调用基类的构造函数,顺序为:先调用基类构造函数然后时派生类的构造函数,析构函数的调用顺序与之相反。classBoxprivate:intwidth,height;public:Box(intm,intn)width=m;height=n;,20,classColorBox:publicBoxprivate:intcolor;public:ColorBox(intm,intn,intc):Box(m,n)color=c;voidmain()ColorBoxob(1,2,3);?如果派生类当中有对象成员,那么构造函数的调用顺序?,21,7.3多重继承与虚基类,1、多重继承的意义单重继承机制可以表示现实世界中大多数客观事物之间的联系关系,然而,现实世界中还存在派生类由多于一个基类继承产生的情况。虽然理论分析表明,派生类由多个基类产生的情况可以分解为若干个派生类由一个基类产生的情况,但是,这样的分解过程比较麻烦,若分解不当,还可能会导致出错。支持多重继承机制的面向对象语言(如VisualC+6.0)使程序设计人员能方便地解决派生类的多重继承问题。,22,2、多重继承的二义性问题多重继承时,可能存在两种二义性问题:数据成员的二义性问题和成员函数的二义性问题(不做介绍)。(1)数据成员的二义性问题。虽然C+语言不允许一个类被多次说明为同一个派生类的直接基类,但允许一个类被多次说明为同一个派生类的间接基类,如下图中,类A就两次被说明为派生类C的间接基类。被两次或两次以上说明为某个派生类间接基类的基类称为该派生类的公共基类。,图7.4,23,多重继承时存在的公共基类现象使数据成员有可能存在二义性问题。如下图所示,类A被两次说明为派生类C的间接基类,假设类A的数据成员有a,类B1的数据成员有b1,类B2的数据成员有b2,类C的数据成员有c,则派生类C的构造函数中存在两个同名的间接基类A的数据成员a,因此存在二义性问题。,图7.5,24,两个同名的数据成员a,一个是由直接基类B1分配内存空间的,另一个是由直接基类B2分配内存空间的,因此若分别加上类名作用域分辨符B1:和B2:,系统即可识别。下面的例子说明了这种数据成员的二义性问题的一种解决方法。,25,例7.3.1类设计和测试主函数如下:#includeclassAprotected:inta;public:A(intaa):a(aa)A(void);,26,classB1:publicAprotected:intb1;public:B1(intaa,intbb1):A(aa),b1(bb1)B1(void);,27,classB2:publicAprotected:intb2;public:B2(intaa,intbb2):A(aa),b2(bb2)B2(void);,28,classC:publicB1,publicB2protected:intc;public:C(intaa1,intaa2,intbb1,intbb2,intcc):B1(aa1,bb1),B2(aa2,bb2),c(cc)C(void)voidPrintA()const,29,/couta=aendl;/存在二义性,编译时将出错coutB1:a=B1:aendl;/加类名分辨符B1:coutB2:a=B2:aendl;/加类名分辨符B2:;,30,voidmain(void)CmyC(1,2,3,4,5);myC.PrintA();程序运行输出结果为:B1:a=1B2:a=2实际上,大多数程序设计中不希望出现上述数据成员的二义性问题。要想在多重继承时不出现多个同名的数据成员,就要在定义派生类时使用下面讨论的虚基类的方法。,31,3、虚基类,在前边的二义性问题中,我们通过在数据成员的前面加上类名:来解决二义性的问题。但是,一般情况下,程序设计中不希望存在数据成员的二义性,不希望在派生类的对象中存在多个公共基类的同名数据成员(或称多个基类子对象)。C+语言解决这个问题的方法是使用虚基类。当一个基类有多于一个派生类时,为防止派生类再派生时,在类层次的继承路径上存在公共基类,从而在派生类中存在公共基类的多个子对象问题,可使用虚基类方法。,32,设计虚基类的方法有下面两种:(1)当一个基类有多于一个派生类时,这些派生类在继承方式前加上virtual关键字。具体格式为:class派生类名:virtualpublicprivateprotected基类名例如,对于上面的实例所示的类层次关系,应在类B1和类B2派生时加上virtual关键字,程序应改为:classB1:virtualpublicAclassB2:virtualpublicA这时,把公共基类A称为虚基类。,33,(2)系统只定义虚基类的一个子对象,虚基类的子对象必须由最新派生出来的派生类直接初始化。例如,对于图7.5所示的类层次关系,虚基类A最新的派生类是类C,因此,对于派生类C中的虚基类A的子对象,应由派生类C直接初始化。这样,例7.3.1中派生类C的构造函数应改为:C(intaa,intbb1,intbb2,intcc):B1(aa,bb1),B2(aa,bb2),A(aa),c(cc)这里,语句A(aa)就是通过直接显式调用虚基类的构造函数,对派生类C中的虚基类A子对象进行了初始化。注意,这样进行的初始化必然只有一次。,34,要说明的是,对于非虚基类,上述这种基类子对象的初始化方法是非法的。对于非虚基类,基类子对象的初始化方法如例7.3.1所示,即类C的构造函数中要显式调用类B1和类B2的构造函数。但对于虚基类,系统只创建一个虚基类的子对象,派生类C的构造函数必须直接显式调用作为虚基类的类A的构造函数。,35,例7.3.2用虚基类的方法修改例7.3.1,使派生类C中只有公共基类A中一个数据成员a。#includeclassAprotected:inta;,36,public:A(intaa):a(aa)A(void);classB1:virtualpublicA/在继承方式前加上virtualprotected:intb1;,37,public:B1(intaa,intbb1):A(aa),b1(bb1)B1(void);classB2:virtualpublicA/在继承方式前加上virtualprotected:intb2;,38,public:B2(intaa,intbb2):A(aa),b2(bb2)B2(void);classC:publicB1,publicB2protected:intc;public:C(intaa,intbb1,intbb2,intcc):B1(aa,bb1),B2(aa,bb2),A(aa),c(cc),39,/显式调用虚基类A的构造函数完成初始化C(void)voidPrintA()constcouta=aendl;/此时数据成员a是惟一的;,40,voidmain(void)CmyC(1,2,3,4);myC.PrintA();程序运行输出结果为:a=1,41,习题,基本概念题7.1什么叫继承
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《行路难(其一)》教学设计
- 《电子元件封装技术》课件
- 中草药有效成分的提取与结构鉴定课件
- 《优化客户沟通技巧》课件
- 安全培训个人总结
- 航空事故处理考核试卷
- 小草的课件教学课件
- 2025年煤炭采掘机械设备合作协议书
- 《T教育讲座》课件
- 运维安全问题
- 医院新媒体管理办法
- 全国粤教清华版初中信息技术八年级下册第1单元第1节《从互联网到物联网》说课稿
- 2025年中天合创煤炭分公司面向社会公开招聘煤炭专业技术人员管理单位笔试遴选500模拟题附带答案详解
- 基于OBE理念的古代汉语教学大纲设计
- 《智能财务与经营分析》课程教学大纲
- 体育赛事自然灾害应急预案
- 生命科学简史知到智慧树章节测试课后答案2024年秋中国科学技术大学
- 2024年协会工作年终总结(2篇)
- 化学教学论试卷(共7篇)
- GB/T 44591-2024农业社会化服务社区生鲜店服务规范
- 《剪映专业版:短视频创作案例教程(全彩慕课版)》 课件 第6章 创作生活Vlog
评论
0/150
提交评论