- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 virtual函数与多态 多态性是面向对象编程三大特性之一,多态性是指对不同类的对象的相似问题采用“统一接口,不同做法”的处理方式。 本章介绍继承结构中基于virtaul函数的动态多态。其中包括virtaul函数、virtaul函数覆盖、纯virtaul函数以及virtaul析构函数的使用方法。 本章的最后对于多继承结构中的virtual继承做了简单的介绍。 知识体系 本章要点: 8.1 多态概述 8.2 virtual函数与virtual函数表 8.3 virtual函数的覆盖与多态 8.4 区分隐藏与virtual函数覆盖 8.5 不能动态绑定函数参数的默认值 8.6 程序实例——雇员管理 8.7 纯virtual函数与抽象类 8.8 virtual析构函数 知识体系: 8.9 程序实例——画图程序 8.10 RTTI 8.11 多继承结构中使用virtual析构函数 8.12 virtual继承和virtual基类 8.1 多态概述 多态一词是指不同的对象收到相同的消息,产生不同的动作。 把函数调用和具体的函数执行代码连接在一起的过程称为联编。多态从联编的实现角度分为:静态多态和动态多态。 本章介绍的动态多态就是使用指向派生类对象的基类指针(或基类引用),在调用基类和派生类同时具有的同名函数时,能够调用派生类版本的函数。C++语言为实现这种动态多态,为用户提供virtual函数机制,编译器的内部采用动态联编来完成运行时的函数调用与函数体的绑定。 8.2 virtual函数与virtual函数表 当自定义类型中存在virtual函数或其基类中存在virtaul函数时,系统将为该类维护一张virtual函数表,这里可以使用的virtaul函数包括该类中声明的virtaul函数,也包括该类的基类中声明的非private属性的virtual函数。例如: class A { public: virtual void f1(); virtual void f2(int); }; class B:public A { }; class C:public B { public: virtual int f3(); }; 上述自定义了类型A、B和C都有各自virtual函数表,见表8.1~8.3。 1 //8.1 指向virtual函数表的指针 5 class A 6 { public: 8 int x; 9 virtual void f1() 10 {} 11 virtual void f2(int) 12 {} 13 }; 14 class B:public A 15 { int y; 17 }; 18 class C:public B 19 { int z; 21 public: 22 virtual int f3() 23 {return 0; 25 } 26 }; 28 int main() 29 { 30 A a; 31 B b; C c; 33 coutsizeof(a)=sizeof(a)endl; 34 coutsizeof(b)=sizeof(b)endl; 35 coutsizeof(c)=sizeof(c)endl; 36 cout---------------endl; 38 couta=aendl; 39 couta.x=a.xendl; 40 coutb=bendl; 41 coutb.x=b.xendl; 42 coutc=cendl; 43 coutc.x=c.xendl; 44 cout---------------endl; 46 A a1; B b1; C c1; 49 coutA类型virtual函数表的地址:*((void **)a)endl; 50 coutA类型virtual函数表的地址:*((void **)a1)endl; 51 coutB类型virtual函数表的地址:*((void **)b)endl; 52 coutB类型virtual函数表的地址:*((void **)b1)endl; 53 coutC类型virtual函数表的地址:*((void **)c)endl; 54 coutC类型virtual函数表的地址:*((void **)c1)endl; 55 cout---------------endl; 57 return 0; 58 } 8.3 vi
文档评论(0)