




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第15章面向对象编程1 面向对象编程 概述定义基类和派生类转换与继承构造函数和复制控制继承情况下的类作用域纯虚函数容器与继承句柄类与继承文本查询示例 面向对象编程概述2 1 继承 对类型之间的关系建模 共享公共的东西 仅特化本质上不同的东西 派生类能继承基类定义的成员 派生类可无须改变而使用那些与派生类型具体特性不相关的操作 并可重定义那些与派生类型相关的成员函数 将函数特化 考虑派生类型的特性 除了从基类继承成员外 派生类还可定义更多的成员 3 classItem base friendstd istream 4 classBulk item publicItem base public std pairdiscount policy const returnstd make pair min qty discount othermembersasbeforeBulk item clone const returnnewBulk item this Bulk item min qty 0 discount 0 0 Bulk item conststd string 5 doubleBulk item net price size tcnt const if cnt min qty returncnt 1 discount price elsereturncnt price 动态绑定6 动态绑定使我们能编写程序使用继承层次中任意类型的对象 无须关心对象的具体类型 使用这些类的程序无须区分函数是在基类中定义的还是在派生类中定义的 calculateandprintpriceforgivennumberofcopies applyinganydiscountsvoidprint total ostream 7 1 虽然这个函数第二个形参是Item base的引用 但实际上可将Item base对象或Bulk item对象传给它 2 由于形参是引用且net price是虚函数 对net price的调用将在运行时确定 调用那个版本的net price将依赖于传给print total的实参 如果传给print total的实参是一个Bulk item对象 将运行Bulk item中定义的应用折扣的net price 如果实参是一个Item base对象 调用由Item base定义的版本 这就是动态绑定 定义基类8 classItem base public Item base conststd string 基类的成员函数9 virtual 基类应将派生类需要重定义的函数定义为虚函数 2 protected 是private和public的混合不能被类用户访问 private 可被类的派生类访问 publc 另外 派生类只能通过派生类对象访问其基类的protected成员 派生类对其基类类型对象的protected成员没有特殊访问权限 派生类10 定义派生类时使用类派生列表指定基类 类派生列表可指定一个或多个基类 Classclassname access labelbase class派生类继承基类成员并可定义自己的附加成员 每个派生类对象包含两部分 从基类继承的成员和自己定义的成员 派生类只需要重定义那些与基类不同或扩展基类行为的方面 定义派生类11 classBulk item publicItem base public redefinesbaseversionsoastoimplementbulkpurchasediscountpolicydoublenet price std size t const private std size tmin qty minimumpurchasefordiscounttoapplydoublediscount fractionaldiscounttoapply 派生类和虚函数12 尽管不是必须 派生类一般会重定义所继承的虚函数 派生类中虚函数的声明必须与基类中的定义方式完全匹配 但有一个例外 返回对基类型的引用 或指针 的虚函数在派生类中可返回基类函数所返回类型的派生类的引用 或指针 也可返回基类的引用 或指针 一旦函数在基类中声明为虚函数 就一直为虚函数 派生类无法改变该函数为虚函数的事实 派生类重定义虚函数时 可以用virtual 也可不用 这不是必须的 派生类中的函数可使用基类的成员13 DoubleBulk item net price size tcnt const if cnt min qty returncnt 1 discount price elsereturncnt price 用作基类的类必须是已定义的14 已定义的类才可用作基类 如果已声明Item base 但没有定义它 则不能用作基类 这是因为 每个派生类中包含并且可以访问其基类的成员 为了使用这些成员派生类必须知道它们是什么 这一规则暗示着不可能从类自身派生出一个类 基类本身也可以是一个派生类 ClassBase ClassD1 publicBase ClassD2 publicD1 Virtual和其他成员函数15 要触发动态绑定 必须满足两个条件 只有指定为虚函数的成员才能进行动态绑定 成员函数默认为非虚函数 非虚函数不能进行动态绑定 必须通过基类类型的引用或指针进行调用 从派生类到基类的转换16 Doubleprint total constItem base ppointstotheitem basepartofbulk 可以在运行时确定virtual函数调用17 C 动态绑定的关键是将基类类型的引用或指针绑定到派生类对象对基对象没有影响 对象本身不会改变 仍为派生类对象 对象的实际类型可能不同于该对象引用或指针的静态类型 18 calculateandprintpriceforgivennumberofcopies applyinganydiscountsvoidprint total ostream 19 Item basebase Bulk itemderived Print total cout base 10 callsItem base net pricePrint totaL cout derived 10 callsBulk item net price当通过指针或引用调用基类对象的虚函数时 一会发生动态绑定 动态绑定时 引用或指针的动态类型和动态类型可能会不同 但是 对象不会变 只有可能是所调用的虚函数不同 非虚函数总是在编译时一确定了调用那个版本 本例中 任何情况下 book调用的都是基类中的book 即使派生类中有自己的book版本 也会调用基类中的book 20 Item base basep 即 可使用作用域操作符强制函数调用使用虚函数的特定版本 public privagte protected继承21 对类所继承的成员的访问由基类中的成员访问级别和派生类派生列表中使用的访问标号共同控制 派生类不能访问基类中的private成员 只有基类本身的成员及友元才可访问private成员 公有继承 基类成员保持自己的访问级别受保护的继承 基类的public和protected在派生类中都为protected私有继承 基类的所有成员在派生类中为private 接口继承与实现继承22 Public派生类继承基类的接口 它具有与基类相同的接口 设计良好的类层次中 public派生类的对象可以用在任何需要基类对象的地方 是最常见的继承形式 Private和protected派生的类不继承基类的接口 这些派生类通常被称为实现继承 派生类在实现中使用继承类但继承基类的部分并未成为其接口的一部分 继承是一种isa的概念ISBN和Item base之间早一种hasa的概念 23 ClassBase public std size tsize const returnn Protected std size tn ClassDerived privateBase ClassDerived privateBase public usingBase size protected usingBase n 默认的继承保护级别24 Class定义的类的成员默认是私有的 struct定义的类的成员默认是公有的 Class定义的派生类默认是private继承 struct定义的派生类默认是public继承 ClassBase StructD1 Base publicinheritanceClassD2 Base privateinheritance用struct和class定义的类没有太大的区别 除了成员默认的访问级别不同及默认的派生保护级别不同 友元关系与继承25 友元关系不能继承 基类的友元对派生类的成员没有特殊访问权限 如果基类被授予友元关系 则只有基类具有特殊访问权限 该基类的派生类不能访问授予友元关系的类 继承与静态成员26 如果基类定义了static成员 则整个类层次中只有一个这样的成员 无论从基类派生出多少个派生类 每个static成员只有一个实例 Static成员遵循常规的访问控制 转换与继承27 可以像使用基类对象一样使用派生类对象 可以将派生类对象的引用或指针转换为基类子对象的引用或指针 但基类只是派生类的一部分 不能像使用派生类一样使用基类 没有从基类引用或指针到派生类对象引用或指针的转换 构造函数和复制控制28 每个派生类对象由派生类中定义的非静态成员加上一个或多个基类子对象构成 这一事实影响着派生类对象的构造 复制 赋值和撤销 当构造 复制 赋值和撤销派生类类型对象时 也会构造 复制 赋值和撤销这些基类对象 基类构造函数和复制控制 本身不是派生类的基类 其构造函数基本不受继承的影响 继承对基类构造函数唯一的影响是 在确定提供那些构造函数时 必须考虑一类新用户 构造函数也可以是protected或private的 某些类需要只希望派生类使用的特殊的构造函数 这样的构造函数应定义为 protected 派生类构造函数 每个派生类的构造函数除了初始化自己的数据成员外 还要初始化基类的数据成员 合成的派生类默认构造函数 派生类的合成默认构造函数与非派生类只有一点不同 除了初始化派生类的数据成员外 还初始化派生类对象的基类部分 对于Bulk item 调用Item Base的默认构造函数 将isbn成同初始化为空串 price成员初始化为0 用常规变量初始化规则初始化Bulk item的成员 也就是说 qty discount成员会是未初始化的 定义默认构造函数 由于Bulk item具有内置类型的成员 所以应定义自己的默认构造函数 它用初始化列表初台化min qty discount 还隐式调用Item base的默认构造函数初始化对象的基类部分 运行这个构造函数的效果是 首先使用权用Item base的默认构造函数初始化Item base部分 它将isbn置为空串 并price置为0 Item base的构造函数执行完毕后 再初始化Bulk item部分的成员 并执行构造函数的函数体 向基类构造函数传递实参 ClassBulk item publicItem base public Bulk item conststd string 在派生类构造函数中使用默认实参 ClassBulk item publicItem base Public Bulk item conststd string book doublesales price 0 0 std size tqty 0 doubledisc rate 0 0 Item base book sales price min qty qty discount disc rate 以上构造函数中为每个形参提供默认值 可用0到4个实参使用它 只能初始化直接基类 一个类只能初始化自己的直接基类 直接基类就是在派生列表中指定的类 设C类从B类派生 B类从A类派生 则C类中包含着B类和A类中定义的成员 但B是C的直接基类 A为C的间接基类 虽然每个C类对象包含一个A类部分 但C的构造函数不能直接初始化A 需要C初始化B B的构造函数再初始化A 这一限制的原因是 类B的作者已经指定了怎样构造和初始化B类型的对象 像B的任何用户一样 类C的作者无权改变这个规约 析构函数 析构函数的工作用于撤销成员 但是 派生类的析构函数不负责撤销基类对象的成员 每个析构函数只负责清除自己的成员 编译器总是显式调用派生类对象基类部分的析构函数 ClassDerived publicBase public Base Baseinvokedautomatically Derived dowhatittakestocleanupderivedmem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业无人机租赁市场2025年用户需求变化趋势与服务平台运营应对
- 工程-发包方案-降幅(3篇)
- 电气工程方案落实(3篇)
- 犬和蛇咬伤课件
- 牧场食堂安全培训课件
- 安全教育安全培训课件
- 林业国企面试题库及答案
- 科技服务业信用评价规范
- 涟水语文面试题库及答案
- 劳动活动面试题库及答案
- 白酒经销合同协议书模板
- 2025年公务员遴选备考冲刺
- 2024年河源市市级机关公开遴选考试真题
- 《网络工程导论》全套教学课件
- 2025苏教版三年级上册数学教学计划 (三篇)
- 2025-2026学年苏教版(2024)小学数学一年级上册教学计划及进度表
- 员工培训课件心脑血管
- 胚胎发育不良性神经上皮肿瘤
- 《焊接结构生产》课件-第二单元 焊接应力与变形
- 智能行政管理课件
- 大学生心理健康十六讲(第3版) 课件全套 第1讲 心理健康知多少-大学生心理健康导论-第16讲 珍爱生命-危机干预与幸福人生
评论
0/150
提交评论