- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十二章 多态性和虚函数 12.1 静态联编和动态联编 12.2 虚函数 12.3 纯虚函数和抽象类 12.4 抽象类实例 问题引入1-多态性 一个名称(函数名)可以有多种语义。用户只需发送同样的消息,而不同类型的对象接收导致不同的行为。 例12.1计算并显示大学生和研究生的学费 12.1静态联编和动态联编 联编(绑定)(binding) 把函数调用与适当的函数代码相对应的动作 (一个标志符与一个内存地址联系在一起的过程)称为联编 联编分为 静态联编 在编译阶段决定执行哪个同名的被调用函数(重载) 动态联编。 在编译阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数 多态性也分为静态和动态两种: 静态多态性——函数重载——静态联编 一个类中的同名函数 同名不同型,可根据参数类型及个数区别语义,通过实际的参数由编译系统决定调用哪个函数, 如在一个类中参数不同的构造函数,运算符重载函数等 动态多态性——虚函数——动态联编 类层次中的不同类中的同名函数, 同名同型(参数一样),因而要根据指针指向的对象所在类来区别语义,来决定调用哪个类的成员函数。(采用动态联编) 对例12.1出现错误输出的解释 void fn(unstudent x) { x.calfee(); x.disp(); } void main() { unstudent s1; graduate s2; cout 大学生收费: endl; fn(s1); cout 研究生收费: endl; fn(s2); } 原因:静态联编+赋值兼容fn(unstudent x)在编译时就确定其对象为unstudent,所以调用的x.calfee()和x.disp()均为unstudent类的成员函数。 期望:执行fn(s)时根据s对象来自动确定调用相应的成员函数,而不是在编译时就确定哪个重载函数被调用——虚函数 12.2.1 虚函数说明 虚函数说明 virtual 类型说明 函数名(参数表) 在基类中定义,是一种成员函数,且非静态 某类中的一个成员函数被说明为虚函数,意味着该成员函数在派生类中可能有不同的实现。 动态联编只能通过基类的指针或引用来操作虚函数。 当使用这个成员函数操作指针或引用所标识的对象时,对该成员函数调用采取动态联编方式,即在运行时进行关联或束定。 12.2.3 虚函数的限制 [例12.4]虚析构函数 #includeiostream.h class A { public: virtual ~A(){cout 调用A::~A() endl;} }; class B : public A { char *buf; public: B(int a){ buf = new char[a];} virtual ~B() { delete[ ] buf; cout 调用B::~B() endl; } }; void fun(A* a) //因A类定义虚析构函数,以根据a所指向的对象的类型 { delete a; //来执行相应的析构函数,本例调用的B的析构 } void main() { A* a = new B(10);//创建无名的B类对象,再让A类指针指向它 fun(a); } [反例12.6]虚函数不同型,不能动态联编 #includeiostream.h class A { public: virtual void disp(int n) {cout A::disp n= n endl; } }; class B : public A { public: virtual void disp(double m){cout B::disp m= m endl;} }; void fn(A a) { a.disp(5.5); } void main() { B b; fn(b); } 12.2.2 多继承中的虚函数-[例12.3] 多个基类中既有虚函数,也有非虚函数的普通函数 #include iostream.h class A { public: virtual void f() { cout class A endl; } }; class B { public: void f() { cout class B endl; } }; class C : public A, public B { void f() { cout class C endl; } }; 12.3纯虚函数和抽象类 12.3.1纯虚函数 纯虚函数的一般格式如下: virtual 类型 函数名(参数表) = 0 许多
文档评论(0)