- 1、本文档共54页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章c教程
9.1 多态性 所谓多态性就是不同对象收到相同的请求消息时,产生不同的动作。 直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。 1 多态的分类 C++中的多态性可以分为四类: 参数多态:函数模板、类模板实例化产生的多态行为 包含多态:通过虚函数实现的、定义于不同类中的同名成员函数的多态行为 重载多态:通过函数重载和运算符重载实现的多态行为 强制多态:通过强制类型转换实现的多态行为。 前面两种统称为通用多态,而后面两种统称为专用多态。 2 多态的实现 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。 编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。 运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。 虚函数提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。 一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。 例如,将Point类的area( )函数声明为纯虚函数,则 Point a(1.5,6.7); //错 但可以说明指向抽象类对象的指针(或引用),例如: Point *pa; 抽象类至少含有一个虚函数,而且至少有一个虚函数是纯虚函数,以便将它与空的虚函数区分开来。下面是两种不同的表示方法: virtual void area( )=0; // 纯虚函数 virtual void area( ) { } // 空的虚函数 在成员函数内可以调用纯虚函数,但在构造函数或析构函数内调用一个纯虚函数将导致程序运行错误,因为没有为纯虚函数定义代码。 void main( ) { C c; c.fun( ); } 输出结果如下: Constructing A // 建立对象c调用B( )产生 Come here and go...Class C // c.fun( )输出 Destructor C // 析构对象c时,由~C()产生 Destructor A // 析构对象c时调用~B()产生 析构时应先调用C的析构函数,输出“Destructor C”。接着调用类B的析构函数,这个析构函数调用虚函数fund。这个虚函数分别在类B的基类A和派生类C中定义,它只能调用它的基类中的虚函数fund,输出“Destructor A”。基类A中的析构函数没有输出信息,程序结束运行。 目前推荐的C++标准不支持虚构造函数。由于析构函数不允许有参数,因此一个类只能有一个虚析构函数。虚析构函数使用virtual 说明。只要基类的析构函数被说明为虚函数,则派生类的析构函数,无论是否使用virtual进行说明,都自动地成为虚函数。 delete运算符和析构函数一起工作(new 和构造函数一起工作),当使用delete删除一个对象时,delete隐含着对析构函数的一次调用,如果析构函数为虚函数,则这个调用采用动态联编。 一般说来,如果一个类中定义了虚函数,析构函数也应说明为虚函数,尤其是在析构函数要完成一些有意义的任务时,例如释放内存等。 如果基类的析构函数为虚函数,则在派生类未定义析构函数时,编译器所生成的析构函数也为虚函数。 9.2.5 纯虚函数与抽象类 在许多情况下,在基类中不能为虚函数给出一个有意义的定义,这时可以将它说明为纯虚函数。它的定义留给派生类来做。说明纯虚函数的一般形式为: class 类名 { virtual 函数类型 函数名(参数列表)=0; }; 点没有面积,可以说明为: virtual double area( )=0; 从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。 说明了纯虚函数的派生类仍是抽象类。如果派生类中给出了基类所有纯虚函数的实现,则该派生类不再是抽象类。 抽象类的这一特点保证了进入类等级的每个类都提供纯虚函数所要求的行为,这保证了围绕这个类等级所建立起来的软件能正常运行,避免了这个类等级的用户由于偶然的失误而影响系统正常运行。 【例9.5】 编写一个程序,用于计算正方形、矩形、 直角三角形和圆的总面积。 class shape{ public: virtual double area( )=
您可能关注的文档
最近下载
- 2025年东莞市常平中学小升初入学分班考试语文模拟试卷.docx VIP
- 关于成立中医院项目商业计划书(参考).docx
- IATF16949公司级SWOT分析表范例.xls VIP
- 2025年河南省机场集团有限公司人员招聘笔试备考题库.docx VIP
- 《SLT 582-2025水工金属结构制造安装质量检验检测规程》知识培训.pptx VIP
- COUSS卡士CO-960S使用说明书.pdf VIP
- T CEPPEA 5006.3-2021 工程总承包项目文件收集与档案整理规范 第3部分:电网工程.docx VIP
- 18D705-2:电动汽车充电基础设施设计与安装.pdf VIP
- 工业用二氯丙烷》标准全文及编制说明.pdf VIP
- 水利对象分类规范.docx VIP
文档评论(0)