C 程序设计教程_12.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文档。上传文档
查看更多
C 程序设计教程_12

第十二章 多态 第十二章内容 1. 继承需要多态 Student是GraduateStudent的基类.则: Student s, *pS; GraduateStudent gs, *pGS; s = gs; // ok gs = s; // error pS = static_castStudent*(gs); // ok pGS = static_castGraduateStudent*(s); // error 同化效应 class Student{ public: // . . . void display(){ cout“UnderGraduate\n”; } }; class GraduateStudent :public Student{ public: // . . . void display(){ cout“Graduate\n; } }; Student ds; GraduateStudent gs; ds.display(); gs.display(); 2. 虚函数 于是应用程序便有多态,而且fn函数实现非常简捷: void fn(Student x){ x.display() } int main(){ Student s; GraduateStudent gs; fn(s); // 显示大学生信息 fn(gs); // 显示研究生信息 } 结果: UnderGraduate Graduate 仅仅对于对象的指针和引用的间接访问,才会发生多态现象 3. 避免误用虚函数 class Base{ public: virtual void fn(int x){ coutBase\n; } }; class Sub : public Base{ public: virtual void fn(double x){ coutSub\n; } }; 4. 多态编程 类的继承体系决定之后,其基类的多态成员函数也可确定, 通常可以在子类之间进行比较,同名不同功能的函数往往可以置成虚函数. 多态编程中,会遇到各种子类混在一个集合中的情形,这正是多态大展身手的时候.针对左边的类体系,有多态的应用代码: vectorshape* a; // . . . for(int i=0; ia.size(); ++i) a[i]-area(); 多态的特征 基类和子类都定义了同名的虚函数 定义了指向基类的指针(或者引用) 指针(或者引用)指向子类对象 调用虚函数 满足上述四个条件将调用子类的虚函数 继承需要多态 虚函数 避免虚函数误用 多态编程 对于上边的类和对象操作,则有下列结果: UnderGraduate Graduate 但是,若执行 Student s = gs; 则执行s.display()的结果为: UnderGraduate 说明,gs虽然是研究生对象,但在赋值给大学生类型对象操作之后,被大学生同化了,丧失了研究生的本性. 类中采用虚函数: class Student{ public: virtual void display(){ cout“UnderGraduate\n”; } }; class GraduateStudent :public Student{ public: virtual void display(){ cout“Graduate\n”; } }; 注:子类同名函数上的virtual可省略 父类对象 子类对象 虚函数1 虚函数2 虚函数表(VFT) 虚函数1 虚函数表(VFT) 虚函数2 虚函数1代码 虚函数2代码 虚函数1代码 虚函数2代码 父类虚函数1 父类虚函数2 子类重载父类成员函数不能传播“虚”性 void test(Base b){ b.fn(3.5); } int main(){ Base a; Sub b; test (a); test (b); } Base Base 函数重载对于编译识别来说,返回类型是不起作用的. 以下代码不是重载,如果出现在同一个类定义或同一个源 文件中,则出错: void fn(int); int fn(int); 以下声明也不是函数重载,如果分别出现在基类和派生类 中,则是多态 virtual Base* fn(); virtual Sub* fn(); 若干限制: 虚函数必须是成员函数 静态成员函数不能是虚函数 内联函数不能是虚函数 构造函数不能是虚函数 析构函数可以是虚函数,并建议声明为虚函数 限制的原因: 多态性是通过成员函

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档