[工学]h第3章面向对象程序设计C++.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]h第3章面向对象程序设计C

第3章 C++面向对象程序设计进阶 3.1 多态和虚函数 3.2 运算符重载 3.3 输入输出流库 3.4 模板 3.1 多态和虚函数 多态性的概念和多态类型 联编 虚函数 纯虚函数和抽象类 多态性的概念 多态性是指具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。 C++的多态性是指对同一条消息,被不同类型的对象接收将产生不同的行为。 多态性是实现“一种接口,多种方法”的技术。这里的“一种接口”是指相同函数名,而“多种方法”是指多种函数实现。 多态的类型 C++中,多态性可分为两种: 编译时的多态性:通过函数重载或运算符重载实现。 运行时的多态性:通过虚函数实现。 (执行前无法确定调用哪个函数,要根据执行情况动态确定) 联编 多态性的实现过程中,确定调用哪个同名函数的过程就是联编(binding),又称绑定。 联编是指计算机程序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程。 按照联编进行的阶段的不同,分为静态联编和动态联编,这两种联编过程分别对应着多态性的两种实现方式。 静态联编 在编译阶段完成的联编称为静态联编。 在编译过程中,编译系统可以根据类型匹配等特征来确定程序中调用操作与执行某个同名函数实现之间的关系, 即确定某一个同名函数到底是要调用哪一段函数实现代码。 函数重载和运算符重载就是通过静态联编方式实现的编译时的多态的体现。 静态联编的优点是函数调用速度快、效率较高。 缺点是编程不够灵活 动态联编 只有在运行程序时才能确定将要调用的函数。 这种在运行阶段进行的联编称为动态联编。 动态联编的优点是提供了更好的编程灵活性、问题抽象性和程序易维护性。 缺点是与静态联编相比,函数调用速度慢。 虚函数 虚函数是动态联编的基础。 虚函数是非静态的成员函数,经过派生之后,虚函数在类族中可以实现运行时的多态性。 虚函数是一个在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。声明虚函数的格式如下: 例[Ex_VirtualFunc] 虚函数 与函数重载相似,虚函数也能使一个函数具有多种不同的版本。 虚函数在基类定义,它的不同版本在该基类的派生类中重新定义。 通过虚函数,达到用基类指针访问派生类对象成员函数的目的。 虚函数 说明: (1)?虚函数在重新定义时参数的个数和类型必须和基类中的虚函数完全匹配,这一点和函数重载完全不同。 (2)?虚函数所具备的上述功能,只有通过基类指针才可实现。虚函数在用对象名和成员运算符以正常方式调用时,不能达到其效果。 如: CShape ss; ss.area(); 其结果是:0.0 纯虚函数和抽象类 定义一个基类时,会遇到这样的情况: 无法定义基类中虚函数的具体实现,其实现完全依赖于其不同的派生类。 例如,一个“形状类”由于没有确定的具体形状,因此其计算面积的函数也就无法实现。--引入纯虚函数 在C++中,有一个仅为该多态机制提供一个接口而没有任何实体定义的函数,被称为纯虚函数。 纯虚函数和抽象类 声明纯虚函数的一般格式为: virtual 函数类型函数名(形参表) = 0; 它与一般虚函数不同的是:在纯虚函数的形参表后面多了个“=0”。 函数名赋于0,本质上是将指向函数的指针的初值赋为0。 例[Ex_PureVirtualFunc] 纯虚函数和抽象类 抽象类只能用作其他类的基类,不能建立抽象类对象。 可以说明指向抽象类的指针或引用,该指针或引用可以指向抽象类的派生类,进而实现多态性。 如: CShape *pShape; CTriangle tri(3,4); pShape=tri; 抽象类的主要作用是将有关的派生类组织在一个继承层次结构中,由抽象类为它们提供一个公共的根,相关的派生类就从这个根派生出来。 3.2 运算符重载 C++中预定义了丰富的数据类型和运算符,但不能满足应用编程的需要:复数类(包括两个double型数据成员:实部、虚部)--对象a, b不可以得到 a+b (C++预定义的运算符只能用于基本数据类型) 运算符重载是对已有的运算符赋予多重含义,使同一运算符可以作用于不同类型的数据。 运算符重载的语法 赋值运算符的重载 提取和插入运算符重载 运算符重载的语法 运算符重载的实质就是函数重载。 函数类型类名::operator 重载的运算符(形参表) { … } // 函数体 运算符重载函数的函数是以特殊的关键

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档