C语言程序设计教程教程C语言第13章C++基础.pptVIP

C语言程序设计教程教程C语言第13章C++基础.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
13.3.4 多态性与虚函数 多态性(Polymorphism)是面向对象程序设计的第三个重要机制。所谓多态性是指同样的消息被不同类的对象接收时导致完全不同行为的这样一种状态。同一个消息作用于不同的对象,其结果各不相同,具有多种形态。这里的消息是指对对象成员函数的调用。前面讨论过的函数重载实现了一种多态性。 例如,对图13.1中的“学生”对象、“大学生”对象、“研究生”对象和“在职研究生”对象发送“显示”这一消息,则显示的内容项各不相同。也就是说,在这些类中,“显示”对应的代码各不相同,这就是所谓多态性。 (1)静态联编与动态联编 联编(binding)是指将函数调用与相应函数体代码彼此相关联的过程。如果联编在编译阶段完成,称之为静态联编(static binding)。重载函数就是采用静态联编的方式。例如求不同类型的两数中较小数的重载函数: int Min(int a,int b); float Min(float x,float y); 虽然两个函数具有相同的函数名Min,但由于其参数类型不同,编译程序可以据此来自动选择对应的函数体进行匹配,也就是说重载函数可以在编译时确定调用哪个函数,因而称为静态联编。 在C++中还有一种联编方式称为动态联编(dynamicbinding)。这种方式是在程序运行时进行联编,一般通过函数指针或引用来实现。 (2)虚函数 在C++中,多态性通过虚函数(Virtual function)来实现,而虚函数存在于继承环境中。虚函数机制使得基类(父类)中定义虚函数后,派生类(子类)中可以重写基类(父类)中成员函数的代码,从而使得在类层次结构中,同一个成员函数可以有不同的版本(即不同的代码)。此时,当一个基类类型的指针指向派生类对象时,若向指针所指的对象发消息,则应该是派生类对象对应的函数代码被执行。但指针所指的对象可能只有在执行时才能知道,这样到底执行哪些代码只有在运行时才能根据指针所指的对象来决定,因此虚函数采用动态联编的方式实现。先看如下的示例: 例13.16 静态联编示例。 #include iostream.h class BASE { int bx; public: BASE(int b){bx=b;} //基类构造函数 void Display(void){cout”BASE:”bx;} void Inc(void){bx++;} }; class INHERITED:public BASE { int dx; public: INHERITED(int b,int d):BASE(b),dx(d){} //派生类构造函数 void nsplay(void){cout”INHERITED:”dx;} void Inc(void){dx++;} }; void func(BASE obj) { obj.Inc( ); obj.Display( ); } int main( ) { BASE baseobj(5); //基类对象声明 BASE*bp; //定义基类指针 INHERITED iobj(5,15); //派生类对象声明 coutendl”指针引用:”; bp=baseobj; //基类指针指向基类对象 bp-Display( ); bp=iobj; //基类指针指向派生类对 bp-Display( ); //bp=baseobj;错误:派生类指针不能指向基类对象 //bp-Display( ); bp=iobj; bp-Display( ); 指向基类对象 bp-Display( ); bp=iobj; //基类指针指向派生类对 bp-Display( ); //bp=baseobj;错误:派生类指针不能指向基类对象 //bp-Display( ); bp=iobj; bp-Display( ); coutendl”对象引用:”; baseobj.Display( ); iobj.Display( ); coutendl”函数调用:”; func(baseobj); func(iobj); return 0; } 程序运行的结果为: 指针引用:BASE:5 BASE:5 INHERITED:15 对象引用:BASE:5 INHERITED:15 函数调用:BASE:6 BASE:6 指向基类对象 bp-Displa

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档