C++及Windows可视化程序设计第7章.ppt

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

第7章 多态性和虚函数 7.1 多态性 7.2 虚函数 7.3 多重继承与虚函数 实验 习题 多态性也称后约束(late binding)或动态约束(dynamic binding),它常用虚函数(virtual functions)来实现。 C++支持两种多态性:编译时的多态性和运行时的多态性。 编译时的多态性通过使用重载函数或模板获得。 运行时的多态性通过使用继承和虚函数来获得。 联编是描述编译器决定在程序运行时,一个函数调用应执行哪段代码的一个术语,是实现多态性的基础。 多态性是一个与实现有关的概念,因而难于理解和掌握。本章将重点集中于介绍运行时的多态性,并结合图解和程序实例帮助读者更好地理解多态性。 7.1 多态性 静态联编所支持的多态性称为编译时的多态性。当调用重载函数时,编译器可以根据调用时所使用的实参,在编译时就确定下来应调用哪个函数。 动态联编所支持的多态性称为运行时的多态性,这由虚函数来支持。虚函数类似于重载函数,但与重载函数的实现策略不同,即对虚函数的调用使用动态联编。 7.1.1 静态联编中的赋值兼容性及名字支配规律 派生一个类的原因并非总是为了添加新的数据成员或成员函数,有时是为了重新定义基类的函数。 第6章的【例6.2】中,类Point和类Rectangle各有一个Show(void)函数,各自完成不同的功能。类的对象和调用的函数一一对应,编译时即可确定调用关系,从而产生编译时的多态性。 【例7.1】 分析下面程序的输出结果。 #includeiostream using namespace std; const double PI=3.14159; class Point { private: double x,y; public: Point(double i,double j){ x=i; y=j; } double area(){ return 0; } }; class Circle: public Point { private: double radius; public: Circle(double a,double b,double r): Point(a,b) { radius=r; } double area() { return PI*radius*radius; } }; void main() { Point a(1.5,6.7); Circle c(1.5,6.7,2.5); cout″area of Point is ″a.area()endl; //(1) cout″area of Circle is ″c.area()endl; //(2) Point *p=c; //(3) cout″area of Circle is ″p-area()endl;//(4) Point rc=c; //(5) cout″area of Circle is ″rc.area()endl; //(6) } 为了便于理解,在注释中给出相应编号。根据编号解释如下: 编译器对(1)的解释是: 显式的a.area()表达式明确告诉编译器,它调用的是对象a的成员函数area,输出0。 同理,对于(2)而言,显式的c.area()表达式明确表示调用的是对象c的成员函数area,输出19.6349。 名字支配规律决定它们调用各自的同名函数area。 (3)和(4)的问题实质是: 如果基类和派生类都定义了“相同名称之成员函数”,通过对象指针调用成员函数时,是决定该指针的基类类型,还是决定指针实际所指的类型?也就是说,表达式“p-area()”应该调用Point∷area(),还是调用Circle∷area()? 根据第6章的赋值兼容性规律,应该调用基类的area函数,输出为0。(4)和(5)的道理与此一样,输出为0。 下面再从内存分配原理入手,深入讨论一下赋值兼容规律。图7.1是Point的对象a和Circle对象c的内存分配关系示意图。 图7.1 Point的对象a和Circle对象c的 内存分配关系示意图 由此可见,对象

文档评论(0)

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

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

1亿VIP精品文档

相关文档