下载此文档

C 程序设计自考4737第8章.ppt


文档分类:IT计算机 | 页数:约42页 举报非法文档有奖
1/42
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/42 下载此文档
文档列表 文档介绍
C 程序设计自考4737第8章.ppt第8章多态性、虚函数C++支持两种多态性,即编译时的多态性和运行时的多态性。编译时的多态性通过使用重载函数或模板获得,运行时的多态性通过使用继承和虚函数来获得。联编是描述编译器决定在程序运行时,一个函数调用应执行哪段代码的一个术语,是实现多态性的基础。由于多态性是一个与实现有关的概念,因而难于理解和掌握。本章将重点介绍运行时的多态性,并结合图解和程序实例帮助读者更好地理解多态性。(latebinding)或动态约束(dynamicbinding),它常用虚函数(virtualfunctions)来实现。静态联编所支持的多态性称为编译时的多态性。当调用重载函数时,编译器可以根据调用时所使用的实参在编译时就确定下来应调用哪个函数。动态联编所支持的多态性称为运行时的多态性,这由虚函数来支持。虚函数类似于重载函数,但与重载函数的实现策略不同,即对虚函数的调用使用动态联编。,有时是为了重新定义基类的函数。例如在第6章的【】中,类Point和类Rectangle各有一个Show(void)函数,各自完成不同的功能。类的对象和调用的函数一一对应,编译时即可确定调用关系,从而产生编译时的多态性。【】分析下面程序的输出结果。#include<iostream>usingnamespacestd;constdoublePI=;classPoint{private:doublex,y;public:Point(doublei,doublej){x=i;y=j;}doublearea(){return0;}};classCircle:publicPoint{private:doubleradius;public: Circle(doublea,doubleb,doubler):Point(a,b) {radius=r;}doublearea(){returnPI*radius*radius;}};voidmain(){Pointa(,);Circlec(,,);cout<<"areaofPointis"<<()<<endl;//(1)cout<<"areaofCircleis"<<()<<endl;//(2)Point*p=&c;//(3)cout<<"areaofCircleis"<<p->area()<<endl;//(4)Point&rc=c;//(5)cout<<"areaofCircleis"<<()<<endl;//(6)}为了便于理解,在注释中给出相应编号。根据编号解释如下:编译器对(1)的解释是:()表达式明确告诉编译器,它调用的是对象a的成员函数area,输出0。同理,对于(2)而言,()表达式明确表示调用的是对象c的成员函数area,。名字支配规律决定它们调用各自的同名函数area。(3)和(4)的问题实质是:如果基类和派生类都定义了“相同名称之成员函数”,通过对象指针调用成员函数时,是决定该指针的基类类型,还是决定指针实际所指的类型?也就是说,表达式“p->area()”应该调用Point::area(),还是调用Circle::area()?根据第7章的赋值兼容性规律,应该调用基类的area函数,输出为0。(5)和(6)的道理与此一样,输出为0。下面再从内存分配原理入手,深入讨论一下赋值兼容规律。。由此可见,对象的内存地址空间中只包含数据成员,并不存储有关成员函数的信息。这些成员函数的地址翻译过程与其对象的内存地址无关。编译器只根据数据类型翻译成员函数的地址并判断调用的合法性。如果声明如下两个指针:Point*pPiont;Circle*pCircle;,类图中只给出同名函数,并且在它们的右边给出声明的类指针与类的关系。

C 程序设计自考4737第8章 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数42
  • 收藏数0 收藏
  • 顶次数0
  • 上传人dyx110
  • 文件大小403 KB
  • 时间2020-10-27
最近更新