C语言8虚函数分解.pptVIP

  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文档。上传文档
查看更多
October Dr. Haibin Zhu 第八章 虚函数 C++中的动态联编是通过虚函数实现的,虚函数允许函数调用与函数体之间的联系在运行时才建立。 8.1 引入派生类后的对象指针 指向基类的指针可以指向其公有派生类对象 根据继承方式的概念,按公有继承的方式产生的派生类中,必然包含了原来基类中的全部成员。因此,一个公有派生类的对象可以提供其基类对象的全部行为,则在程序中可以把一个公有派生类对象当作其基类对象来处理,那么,指向基类的指针自然也可以指向其公有派生类对象。 【例】基类指针、派生类指针、基类对象和派生类对象四者间组合的使用情况示例 #include iostream.h class A { int a; public: A(int i=1) {a=i;} void print( ) {couta=aendl;} int geta( ) {return a;} }; class B:public A { int b; public: B(int j=2) {b=j;} void print( ) {coutb=bendl;} int getb( ) {return b;} }; void main() {A aa(10),*pa; B bb(20),*pb; pa=aa; pa-print(); pb=bb; pb-print(); pa=bb; pa-print(); bb.print(); coutpa-geta()endl; pb=aa; } 如改为pa-getb();则错误,因基类指针仅能看到派生类中的基类部分,而不能直接访问公有派生类中定义的成员,但可采用强制类型转换((B*)pa)-getb(); 结果: a=10 b=20 a=1 b=20 1 //基类指针可以指向基类对象 //派生指针可以指向派生类对象 //基类指针可指向它的公有派生类对象,但不许指向它的私有派生类对象。 //错误,派生类指针不可以直接指向基类对象 8.2 虚函数的定义及使用 1.虚函数的作用 上例中,虽然基类指针pa指向派生类对象bb(即pa=bb),但语句pa-print()所调用的函数仍是基类对象的print()。这是由于虽然一个基类指针可以指向其派生类对象,但指针本身的属性并没有改变,因此,系统认为它所指向的仍然是一个基类对象,于是就只能调用其基类的成员函数print()。但在派生类中已经改变了这个函数的实现,即在派生类中又定义了一个同名的print()函数,而这种改变在静态联编时编译器并不知道,以致于造成和我们期望的结果不统一。 所以,必须通知编译器这种可能的改变,即需要进行动态联编,其方法就是在基类中将可能发生改变的成员函数声明为虚函数。否则,若要调用派生类中的成员函数print(),只能采用显式的方法:bb.print(); 或采用对指针强制类型转换的方法((B*)pa)-print(); 基类用虚函数提供了一个派生类对象都具有的共同界面,派生类又各自对虚函数定义自己的具体实现,即常说的“同一接口,多种方法”。这样,使得程序既简洁又具有扩充性,并能帮助程序员处理越来越复杂的程序。 2.虚函数的定义 在基类中的成员函数原型前加上关键字virtual,其格式如下: class 类名 { …… virtual 类型 函数名(参数表); …… }; 当一个类的成员函数说明为虚函数后,就可以在该类的(直接或间接)派生类中定义与其基类虚函数原型相同的函数。这时,当用基类指针指向这些派生类对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数。也就是说,当用基类指针指向不同派生类对象时,系统会在程序运行中根据所指向对象的不同,自动选择适当的函数,从而实现了运行时的多态性。 【例】虚函数的定义与应用举例。 #include “iostream.h” class Base { public: virtual void show() { cout”base class\n”; } }; class Der1: public Base { public: void show() { cout”derived class 1 \n”; } }; class Der2: public Base { public: void show() { cout”derived class 2”; } }; void main() { Base

文档评论(0)

bbnm58850 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档