- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
请参看相关附件6543-1.ppt
《面向对象技术与Visual C++》--第5章 第5章 多态性 本章主要内容 多态性的概念和多态类型 联编 虚函数 抽象类 运算符重载 5.1 多态性的概念 多态性是指具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。 C++的多态性是指对同一条消息,被不同类型的对象接收将产生不同的行为。 多态性是实现“一种接口,多种方法”的技术。这里的“一种接口”是指相同函数名,而“多种方法”是指多种函数实现。 也可以说多态性就是指同样的消息被类的不同的对象接收时导致的完全不同的行为的一种现象。这里所说的消息即对类成员函数的调用。 C++支持两种不同类型的多态:一种是编译时的多态,另一种是运行时的多态。在编译时的多态是通过静态联编实现;而在运行时的多态则是通过动态联编实现。 利用多态性,用户能够发送一般形式的消息,而将所有的实现细节留给了消息的对象,所以说多态性与数据封装和继承共同构成面向对象程序设计的三大机制。 5.2 联编 多态性的实现过程中,确定调用哪个同名函数的过程就是联编(binding),又称绑定。 联编是指计算机程序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程。 用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。 按照联编进行的阶段的不同,可以分为静态联编和动态联编,这两种联编过程分别对应着多态性的两种实现方式。 5.2.1 静态联编 1)主要特点 在编译阶段完成的联编称为静态联编。 在编译过程中,编译系统可以根据类型匹配等特征来确定程序中调用操作与执行某个同名函数实现之间的关系,即确定某一个同名函数到底是要调用哪一段函数实现代码。 函数重载和运算符重载就是通过静态联编方式实现的编译时的多态的体现。 静态联编的优点是函数调用速度快、效率较高,缺点是编程不够灵活。 2) 用基类指针指向公有派生类对象 既然一个公有派生类对象可以当作基类对象使用,那么,指向基类的指针自然也可以指向其公有派生类对象。因此,基类指针、派生类指针、基类对象和派生类对象四者间有以下四种组合的情况: (1)直接用基类指针指向基类对象。 (2)直接用派生类指针指向派生类对象。 (3)用基类指针引用其派生类对象。 (4)用派生类指针引用基类对象。 由于(1)、(2)两种情况,指针类型和对象类型统一,因此完全不会出错。 对于第(3)种情况,由于可以把一个公有派生类对象当作基类对象处理,所以可以用基类指针指向其派生类对象。但必须注意的是,由于基类指针本身的类型并没有改变,因此基类指针仅能访问派生类中的基类部分。在程序中,当把派生类对象的指针赋给基类指针时,编译器能自动完成隐式类型转换。 对于第(4)种情况,将派生类指针直接指向基类对象十分危险,因为编译器不允许、也不提供隐式类型转换。当然,程序员如果采用强制类型转换,也可以把基类指针转换为派生类指针,但这时要正确地使用该指针。 【例5-1】基类指针、派生类指针、基类对象和派生类对象四者间组合的使用情况示例。 #include iostream.h class A //定义类A {private: int a; public: A(int i=1) {a=i;} void print(); int geta(); }; void A::print () { couta=aendl; } int A::geta() { return a; } class B:public A //定义类B —— 类A的公有派生类 { private: int b; public: B(int j=-1) {b=j;} void print(); int getb() { return b; }}; void B::print () { coutb=bendl; } void main() {A aa(10),*pa; B bb(20),*pb; pa=aa; //基类指针可以指向基类对象 pa-print(); pa=aa; pa-print();pb=bb; //派生指针指向派生类对象pb-print();pa=bb; //派生类对象赋给基类指针coutpa-geta()endl; //如为pa-getb();则错误 //因为基类指针仅能看到派生类中的基类部分 pa-print(); bb.print(); pb=(B *)pa
文档评论(0)