- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章多态与动态联编
第11章 多态与动态联编 本章教学目标: 理解虚拟函数、动态多态性和动态联编地概念。 了解虚拟函数和动态联编对实现动态多态地作用。 理解虚拟函数地声明、定义方法和访问属性。 理解纯虚拟函数和抽象类地概念,掌握纯虚拟函数和抽象类的定义方法。 了解抽象类和具体类的区别。 了解虚拟析构函数的概念和作用,掌握其声明和使用方法。 理解动态联编的实现机理,学会使用动态多态特性。 第11章 多态与动态联编 11.1虚拟函数、动态多态性与动态联编 11.2虚拟函数的访问属性 11.3纯虚拟函数与抽象类 11.4虚拟函数应用举例 11.5虚拟析构函数 11.6动态联编的实现机理 11.1 虚拟函数、动态多态性与动态联编 虚拟函数(virtual function)是 C++ 进行 OOP 最富魅力的特征,灵活运用虚拟函数可以构造高度抽象和重用性好的程序。 //例11.1 虚拟函数的定义和使用。 #includeiostream.h class Base { public: virtual void vfun(void) //用关键字virtual定义虚拟函数vfun() { coutBase vfun\n;} }; class Drv1:public Base { public: void vfun(void) { coutDrv1 vfun\n;} }; class Drv2:public Base { }; class Drv3:public Base { public: void vfun(void) { coutDrv3 vfun\n;} }; class DDrv:public Drv1 { public: void vfun(void) { coutDDrv vfun\n;} }; void main() { Base *vp; //同一接口,多种方法: vp=new Base; vp-vfun(); vp=new Drv1; vp-vfun(); vp=new Drv2; vp-vfun(); vp=new Drv3; vp-vfun(); vp=new DDrv; vp-vfun(); } /*程序的执行结果如下: Base vfun Drv1 vfun Base vfun Drv3 vfun DDrv vfun */ 此例中,用关键字virtual在基类Base中定义了一个虚拟函数vfun(),同时在派生类Drv1和Drv3以及Drv1的派生类DDrv中分别定义了一个接口完全相同的函数(可省略关键字 virtual,系统自动地将其定义为virtual,但从可读性方面考虑建议不要省略virtual),但在派生类 Drv2中没有定义 vfun(),这样做是为了对比地说明虚拟函数的用法。 为了使用虚拟函数必须使用指向基类的指针,本例中,在主函数中定义了一个指向基类Base的指针vp,在C++中一个指向基类的指针可以用来指向其派生类的对象 。 访问非虚拟函数是编译时决定的,称为“静态联接”(或“静态约束”、“静态装订”:static binding,或“早期约束”:early binding);访问虚拟函数是在程序运行时动态决定的,称为“动态联接”(或“动态约束”、“动态装订”:dynamic binding,或“晚期约束”:lately binding)。 虚拟函数:基类中被关键字 virtual说明并在一个或多个派生类中被重新定义的函数原型完全一致的成员函数。 关于虚拟函数应注意以下几点: ·除虚拟析构函数外,虚拟函数要求函数原型必须完全相同(函数体可不同),否则视为重载函数; ·虚拟函数必须是类的成员函数(静态成员函数和构造函数除外),一般说来,外部函数不能声明为虚拟函数; ·友元不能声明为虚拟函数,但虚拟函数可以是另一个类的友元; ·析构函数可以是虚拟函数,但构造函数不能为虚拟函数。当基类中的析构函数定义为虚拟函数以后,派生类中的析构函数都自动定义为虚拟函数,很显然,派生类的析构函数与基类的析构函数是不同名的。 ·如果想使用虚拟函数进行动态约束,则必须用指向基类的指针或引用来访问它,否则将为静态联编 使用虚拟函数的最大优点是:通过动态装订构造了一个抽象接口,提高了模块的独立性和易维护性。 在C++中,利用虚拟函数和多态性,使得基类和派生类之间形成一种从抽象到具体、从一般到特殊的层次关系。在基类中我们可以声明本类和派生类都共有的函数(即一般化、抽象化、通用化、泛化),同时允许在派生类中对其中的某些或全部函数进行特殊定义(具体化、特殊化、特化、)。这种方法更接近于人类的思维方法,这也是虚拟函数和多态的重要
文档评论(0)