- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
类和对象 多态 运算符重载
C++程序设计 十二章 多态性与虚函数 12.1 多态性 虚函数 同一个类中,不能定义两个名字相同、参数个数和类型都相同的函数,否则是重复定义。 虚函数 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 ? 程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。 虚函数 virtual 类型说明符 函数名(参数表) 即在类的说明中,在函数原型之前加virtual。 注意: virtual 只用在类定义的原型说明中,不能用在函数实现中。 具有继承性,基类中定义了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 本质:不是重载定义而是覆盖定义。 调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。 静态关联与动态关联 关联(联编)的含义是指把一个消息和一个方法联系在一起,也就是把一个函数名与其实现代码联系在一起 关于虚函数的注意事项: 只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数 一个成员函数被声明成虚函数以后,同一类族中不能再定义一个非virtual的但与该虚函数具有相同参数(包括个数和类型)和函数返回值类型的同名函数。 虚函数的函数体可以是空的,具体的功能由派生类添加。 在什么情况下声明虚函数 成员函数所在的类是否为基类,且在其派生类中是否希望被更改功能 是否通过基类指针或引用去访问。 虚函数与重载函数的比较 (1)重载函数要求函数有相同的函数名称,并有不同的参数序列;而虚函数则要求这三项(函数名、返回值类型和参数序列)完全相同; (2)重载函数可以是成员函数或友员函数,而虚函数只能是成员函数; (3)重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数; (4)虚函数在运行时表现出多态功能,这是C++的精髓;而重载函数则在编译时表现出多态性。 虚析构函数 一个简单的例题:例12-3 虚析构函数的应用场合: 主要用于:如果用new运算符建立了临时对象,若基类中有析构函数,并且定义了一个指向该基类的指针变量。在程序用带指针参数的delete运算符撤销对象时,会发生一个情况: 系统会只执行基类的析构函数,而不执行派生类的析构函数。 原因:p是指向基类的指针变量,指向new开辟的动态存储空间,detele释放该空间。 构造函数能声明为虚函数吗? 纯虚函数 纯虚函数是在基类中只声明虚函数而不给出具体的函数定义体,将它的具体定义放在各派生类中,称此虚函数为纯虚函数。通过该基类的指针或引用就可以调用所有派生类的虚函数,基类只是用于继承,仅作为一个接口,具体功能在派生类中实现。 纯虚函数的声明如下: virtual 函数原型=0; 其中:函数原型的格式同前面所学格式一样,要包括函数返回值的类型、函数名、圆括号、形参及其类型等 抽象类 声明了纯虚函数的类,称为抽象类。 使用纯虚函数时应注意: (1)抽象类中可以有多个纯虚函数。 (2)不能声明抽象类的对象,但可以声明指向抽象类 的指针变量和引用变量。 (3)抽象类也可以定义其他非纯虚函数。 (4)如果派生类中没有重新定义基类中的纯虚函数,则在派生类中必须再将该虚函数声明为纯虚函数。 (5)从抽象类可以派生出具体或抽象类,但不能从具体类派生出抽象类。 (6)在一个复杂的类继承结构中,越上层的类抽象程度越高,有时甚至无法给出某些成员函数的实现,显然,抽象类是一种特殊的类,它一般处于类继承结构的较外层。 (7)引入抽象类的目的,主要是为了能将相关类组织在一个类继承结构中,并通过抽象类来为这些相关类提供统一的操作接口。 应用举例 例1. 设计一个抽象类shape,它表示具有形状的东西,体现了抽象的概念,在它下面可以派生出多种具体形状,比如三角形、矩形。 #includeiostream.h class Shape { protected: double x,y; public: void set(double i, double j) { x=i; y=j; } virtual void area()=0; //声明纯虚函数 }; class Triangle: public Shape { public: void area() { cout 三角形面积: 0.5*x*yendl; } }; class Rectangl
您可能关注的文档
最近下载
- (苏教版)数学五年级上册寒假“天天练”作业设计,含30份题组,附参考答案.pdf
- 《(电影、美剧超级大包)(英语中字)(BD-MKV HD-MKV 1200G)115 先收着。。。转自deefun》.doc
- 2023年黑龙江省烟草专卖局(公司)真题.docx VIP
- 招标采购代理规范zbtb-t a01-2016.pdf
- 小儿肺脏超声基础课件.ppt
- 华南理工大学《管理统计学》课件-第2章统计数据的描述.pptx
- 2023年黑龙江省烟草专卖局系统考试真题.docx VIP
- 《好妈妈胜过好老师》.doc
- 家长会参考讲义——围棋与孩子的素质教育幻灯片课件.ppt
- 华南理工大学《管理统计学》课件-第6章方差分析与试验设计.pptx
文档评论(0)