C++课件第十一章继承和派生类.ppt_第1页
C++课件第十一章继承和派生类.ppt_第2页
C++课件第十一章继承和派生类.ppt_第3页
C++课件第十一章继承和派生类.ppt_第4页
C++课件第十一章继承和派生类.ppt_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论