




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章继承和派生类 类是一种抽象数据类型 是对具有共同属性和行为的对象 事物 的抽象描述 顶层的抽象事物具有处于底层的抽象事物的共同特征 而处于底层的抽象事物除了包含顶层抽象事物的特征外 还具有自身的我特征 一个类继承另一个类时 这个类被称为继承类 派生类或子类 另一个类被称为被继承类 基类或父类 继承类包含了被继承类中的所有成员 且有自己的成员 继承 从一个或多个先前定义过的类 称为基类 中接受全部或一部分数据 属性 或函数 行为或操作 并且补充定义新的数据或函数 因而形成一个新的低层的类 称为派生类 而该派生类还可用作更低层派生类的基类 classdemo protected intj public demo j 0 voidadd inti j i voiddisplay cout j endl 1派生类定义的格式 classchild publicdemo public voidsub inti j i voidmain void childobject object1 object display object add 10 object display object sub 5 object display object1 display 0 10 5 0 定义派生类的基本格式 class派生类名 继承权限基类名继承权限 public protected private影响的是被继承的原基类成员的访问权限class定义的默认为private struct定义的默认为public 继承权限为public时 称该派生为公有派生 基类中的所有public成员在派生类中仍是public成员 所有protected成员在派生类中仍是protected成员 继承权限为private时 称该派生为私有派生 基类中的public成员和protected成员在派生类中均变成private成员 继承权限为protected时 称该派生为保护派生 基类中的public成员和protected成员在派生类中均变成protected成员 无论哪一种继承权限 其基类的private成员均不能为派生类所继承 但可通过被同时继承下来的原基类的某些函数间接访问它们 private aa1protected aa2public aa3 A ClassB publicA private bb1protected bb2public bb3 private bb1protected aa2bb2public aa3bb3 B 公有派生 private aa1protected aa2public aa3 A ClassB protectedA private bb1protected bb2public bb3 private bb1protected aa2bb2aa3public bb3 B 保护派生 private aa1protected aa2public aa3 A ClassB A private bb1protected bb2public bb3 private bb1aa2aa3protected bb2public bb3 B 私有派生 2派生类的使用 includeclassemployee private char name shortage floatsalary public employee name 0 age 0 salary 0 0 employee char name1 shortage1 floatsalary1 name newchar strlen name1 1 strcpy name name1 age age1 salary salary1 voidprint const const成员函数 不能改变类中成员数据的值 也不能调用类中非const成员函数 cout name name cout age age cout salary salary endl employee delete name Manager 除具有employee的属性外 有新的属性 为避免重复定义 可从employee中派生出manager 派生类 classmanager publicemployee private intlevel public manager level 0 manager char name1 shortage1 floatsalary1 intlevel1 employee name1 age1 salary1 level level1 voidprint level cout level level endl 派生类构造函数 使用初始化符表初始化基类中的成员 缺省构造函数 若基类无缺省构造函数 将出错 voidmain managerm xyz 24 1000 2 m print level m print m employee print voidmain managern n print level n print 若a是Y从X类中继承来的公用成员 设y是Y的一个对象 则可访问y a或y X a protected访问指明符 外部函数不能访问 派生类成员函数可直接访问 classemployee private shortage floatsalary protected char name 派生类成员函数 voidmanager print name const cout name endl 外部函数 voidf managerm cout m name endl 错 继续派生 classdirector publicmanager employee 多层继承 classx protected inti j public x inti intj x i i x j j voidprint cout i i j j endl classy publicx intk public y inti intj x i j k i j 初始化列表voidprint cout i i j j k k endl 支配规则 就近原则 classz publicy public z inti intj y i j 初始化列表voidprint1 cout i i j j endl voidprint y print voidmain yy1 23 45 y1 print y1 x print zz1 10 20 z1 print z1 print1 z1 y print z1 x print i 23j 45k 1035 i 23j 45 i 10j 20k 200 i 10j 20 i 10j 20k 200 i 10j 20 对属于基类的成员进行初始化是通过初始表中的初始化项来初始化的 若初始化表中没有调用基类的初始化项 则自动调用基类的无参构造函数进行初始化 如果派生类的自有成员和继承成员同名 则自有成员优先 即通过这个共同的成员名所访问的是自有成员 而不是继承成员 这种情况下 可以在成员名前加类区分符将同名成员区分开 支配规则 作用域运算符不能连续使用 即下列形式是不允许的 CName1 Cname2 Cnamen作用域运算符的左操作数可以是当前对象的直接基类 也可以是当前对象的间接基类 祖先类 3多重继承与冲突 由多个基类派生出一个子类称之为多重继承在多重派生中 如果不同的基类具有名字相同的共有成员或保护成员 此时若在派生类中不正确使用它们 就会产生二义性 这种情况称之为冲突 例 冲突的程序示例 classA protected intx public A inta x a voidShow void cout x x n classB protected intx public B inta x a voidShow void cout x x n classC publicA publicB 多重继承 inty public C inta intb A a B b 多重继承的初始化 voidSetx inta x a 冲突A x a 正确 冲突的解决办法 在成员名前加上基类名 voidSety intb y b intGety void returny voidmain void Cc1 10 100 c1 Show 冲突c1 B Show 正确 classB1 protected intx public voidShow cout x x n classB2 protected intx public voidShow cout x x n classD1 publicB1 classD2 publicB2 classC publicD2 publicD1 public voidSetx1 inta D1 B1 x a 错误 域运算符不能连续使用voidSetx1 inta D1 x a 正确 或为B1 x a voidSetx2 inta D2 x a 正确 或为B2 x a voidmain void Cc c Setx1 2 c D1 B1 Show 错误 域运算符不能连续使用c SetX2 3 c D2 Show 正确 或为c B2 Show 4构造 析构函数的调用顺序 构造函数的调用顺序只与派生类继承基类的顺序有关 而与初始化成员列表中构造函数顺序无关 一个类的构造函数只能对它的直接基类的构造函数传递实参 派生类所不能继承的 5访问类型的调整 有时为了某种目的 需要将从派生类继承的内容的访问类型进行调整 这时可以通过访问声明进行 访问声明的一般格式为 其中 必须基类的public和protected类型的成员名 在访问声明时仅仅说明基类成员名 即对成员数据不可以为它说明数据类型 对成员函数不可以说明参数和返回值类型 例 用访问声明调整访问类型classCbase intx protected inty public intFun inta intb returna classCDerived Cbase protected intCBase y 错误 数据成员的访问声明中不能有类型CBase y 正确public intCBase Fun int int 错误 成员函数的访问声明不能有参数和返回值类型CBase Fun 正确 访问声明不允许在派生类中改变基类成员的访问类型 即基类中的protected成员在派生类中只能调整为protected类型 基类中的public成员在派生类中只能调整为public类型 对基类中重载函数进行访问声明 将会调整基类中所有具有该名的函数的访问类型 如果在派生类中有与基类中同名的函数 也允许在派生类中对该函数进行访问声明 6赋值兼容规则 赋值兼容规则是指 在具有继承关系的类之间 1 公有派生类对象可直接赋值给基类的对象2 基类对象不可以赋给派生类对象3 公有派生类对象的地址可赋给基类指针变量4 公有派生类对象可以初始化基类引用5 在将公有派生类的对象赋给基类对象之后 基类对象只能访问派生类中从基类继承的公有成员 不能访问派生类中增加的公有成员 例 赋值兼容规则classCbase protected intx public CBase inta x a voidShow1 cout x x n classCDerived publicCbase protected inty public CDerived inta intb CBase b y a voidShow1 cout y y n voidShow2 cout y y n voidmain Cderivedc 2 3 Cbaseb1 4 b2 Cbase 错误 理由同上 7虚基类 基类A被一个派生类D多次继承 类D产生两个类A的副本 virtual 虚基类的类层次 虚基类的基本思想是 当将一个基类声明为虚基类时 不管它在派生类中被继承多少次 该基类中的成员在该派生类中始终都只有一个拷贝 即所有派生类均共享基类成员 虚基类通过关键字Virtual实现 classA private intx public voidsetx inta x a voidgetx cout x endl classB publicA classC publicA classD publicB publicC voidmain Dm m B setx 3 m B getx m C setx 4 m C getx m A setx 5 会产生冲突 m A getx 会产生冲突 非虚基类继承 3 4 classA private intx public voidsetx inta x a voidgetx cout x endl classB virtualpublicA 定义虚基类classC virtualpublicA 定义虚基类classD publicB publicC voidmain Dm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中分子与细胞课件
- 高三物理最后一课课件
- 高三家长会课件
- 高一政治课件资本主义
- 知识产权保护劳动合同补充协议书变更
- 《离婚冷静期间婚姻法律咨询与代理服务合同》
- 汽车美容店租赁合同经营许可及监管协议
- 智能家居研发合伙协议退伙技术成果转化协议
- 智能制造工程合同签订关键要素及法律风险防范
- 离婚诉讼中子女抚养费及扶养费调整协议书
- 【一例重症肺炎的个案护理案例报告6000字(论文)】
- 员工培训体系优化研究
- 冯友兰-人生的境界课件
- 传热学全套PPT完整教学课件
- 部编版六年级道德与法治上册第5课《国家机构有哪些》优秀课件
- 高中心理健康教育北师大版高二全册第6课《温故知新》省级名师优质课教案比赛获奖教案示范课教案公开课教案
- 瑞美检验医生工作站操作手册
- 欧美电影文化(上海工程技术大学)【智慧树知到】网课章节答案
- 双人心肺复苏
- 全过程工程咨询服务大纲
- T-GDPA 3-2021 奥利司他胶囊质量标准
评论
0/150
提交评论