_多态性.pptVIP

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
_多态性

例8_4 (7_4)(续) void main(){ B0 b0; B1 b1; D1 d1; //声明B0,B1,D1类对象 B0 *pt=b0; //声明B0类指针,并指向B0对象 fun(pt); //通过指针访问成员函数(虚函数) pt=b1; //B0类指针指向B1,类型兼容性规则; fun(pt); pt=d1; //B0类指针指向D1 fun(pt); //b1.display(); //静态绑定 } 使用虚函数结果: B0::disp() B1::disp() D1::disp() 不使用虚函数结果:B0::disp() B0::disp() B0::disp() 注意: 在例8_4中,派生类B1、D1中并没有显式给出虚函数声明,这时系统遵循以下的规则来判断一个函数成员是不是虚函数: 1、该函数是否与基类的虚函数有相同的名称; 2、该函数是否与基类的虚函数有相同的参数个数及相同的对应参数类型; 3、该函数是否与基类的虚函数有相同的返回值或者满足赋值兼容规则的指针、引用型返回值 //静态绑定 #includeiostream.h class Point { int x,y; public: Point(int i,int j){x=i;y=j;} int Area() const{return 0;} }; class Rectangle:public Point { int w,h; public: Rectangle(int i,int j,int k,int l):Point(i,j){w=k;h=l;} int Area()const{return w*h;} }; void fun(Point s){ coutArea=s.Area()endl;} void main() { Rectangle rec(3,5,15,25); fun(rec); } virtual //动态绑定 结果:Area=0 结果:Area=375 例8-6:分析下列程序执行结果,并回答问题 #include iostream using namespace std; class A{ public: void act1() //虚函数 { coutA::act1() called. endl; } void act2() { act1(); } }; class B:public A //公有继承,B是A的子类 { public: void act1() {coutB::act1() called. endl;} }; void main(){ B b; b.act2(); } 运行结果: A::act1() called. virtual B::act1() called. 例8-6(续1) 回答下列问题: (1)该程序执行后的输出结果是什么?为什么? 输出结果为:B::act1() called. 原因: a. B从A公有继承,B是A的子类;   b. B中的act1()为虚函数;   c. b.act2()调用A中的act2(),进一步调用 act1(),实现动态联编,运行时选择B::act1(); 例8-6(续2) (2)如果将A::act2()的实现改为:     void A::act2()     {      this-act1();     } 输出结果是什么?为什么?     输出结果与(1)相同,即:B::act1() called. 原因:this指向操作该成员函数的对象,基于与(1)相同的原因,此处调用B::act1()。 例8-6(续3) (3)、如果将A::act2()的实现改为:     void A::act2()     {      A::act1();     }   输出结果是什么?为什么? 输出结果:A::act1() called. 原因:此处增加了类名限定,因此要进行静态连编,即调用的是A::act1()。 8.6 虚析构函数 在C++中,不能声明虚构造函数,但是可以声明虚析构函数。 虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的。 虚析构函数没有类型、也没有参数。 虚析构函数的声明: virtual ~类名(); 如果一个类的析构函数是虚函数,那么,由他派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类类型的指针就能调用适

文档评论(0)

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

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

1亿VIP精品文档

相关文档