设为首页 加入收藏

TOP

2.2.7 虚函数与多态性、纯虚函数(2)
2013-10-07 15:20:10 来源: 作者: 【 】 浏览:70
Tags:2.2.7 函数 多态性

2.2.7  虚函数与多态性、纯虚函数(2)

为什么输出的结果不是"fish bubble"呢?这是因为在我们将fish类的对象fh的地址赋给pAn时,C++(www.cppentry.com)编译器进行了类型转换,此时C++(www.cppentry.com)编译器认为变量pAn保存就是animal对象的地址。当在fn函数中执行pAn->breathe()时,调用的当然就是animal对象的breathe函数。

为了帮助读者更好地理解对象类型的转换,我们给出了fish对象内存模型,如图2.13所示。

 
图2.13  fish类对象的内存模型

当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的对象,然后才调用fish类的构造函数完成自身部分的构造,从而拼接出一个完整的fish对象。当我们将fish类的对象转换为animal类型时,该对象就被认为是原对象整个内存模型的上半部分,也就是图2.13中的"animal的对象所占内存"。当我们利用类型转换后的对象指针去调用它的方法时,自然也就是调用它所在的内存中的方法。因此,出现如图2.12所示的结果,也就顺理成章了。

现在我们在animal类的breathe()方法前面加上一个virtual关键字,结果如例2-17所示。

例2-17

  1. #include <iostream.h> 
  2. class animal  
  3. {  
  4. public:  
  5.      void eat()  
  6.      {  
  7.           cout<<"animal eat"<<endl;  
  8.      }  
  9.      void sleep()  
  10.      {  
  11.           cout<<"animal sleep"<<endl;  
  12.      }  
  13.      virtual void breathe()  
  14.      {  
  15.           cout<<"animal breathe"<<endl;  
  16.      }  
  17. };  
  18. class fish:public animal  
  19. {  
  20. public:  
  21.      void breathe()  
  22.      {  
  23.           cout<<"fish bubble"<<endl;  
  24.      }  
  25. };  
  26.  
  27. void fn(animal *pAn)  
  28. {  
  29.      pAn->breathe();  
  30. }  
  31. void main()  
  32. {  
  33.      animal *pAn;  
  34.      fish fh;  
  35.      pAn=&fh;  
  36.      fn(pAn);  
  37. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.2.7 虚函数与多态性、纯虚函数.. 下一篇2.2.7 虚函数与多态性、纯虚函数..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

Shell 基本运算符 -
Shell 函数 | 菜鸟教
Linux 常用命令集合
socket 编程如何实现
Python创建简易的Soc