实例演示C 多态的实现过程
创始人
2024-07-18 02:30:37
0

多态描述的是使用基类的指针或引用操作多个类型的能力。

我们知道,子类的指针是可以隐式转化为父类的,所以我们在进行程序设计的时候如果要对一个未知的类型进行处理,可以在方法声明时把参数的类型声明为父类的指针。

这要我们就是实现了根据传入的类型执行不同的方法。这里的关键是子类在重写父类的虚方法时是在虚方法表的相应位置对父类虚方法实现覆盖。

举个例子:

头文件classFile.h:

  1. #ifndef classFile_Header_File   
  2. #define classFile_Header_File   
  3. class father   
  4. {   
  5. public:   
  6.     virtual void show();   
  7. };   
  8. class son: public father   
  9. {   
  10. public:   
  11.     void show();   
  12.     void sayhi();   
  13. };   
  14. #endif 

这里我们在子类中对父类实现了override(C++没有提供override关键字,所以改写父类的方法要格外小心)。

TestPoly.cpp代码如下:

  1. #include   
  2. #include"classFile.h"   
  3. using namespace std;  
  4.  
  5. void hello(father* fp)   
  6. {   
  7.         fp->show();   
  8. }   
  9. int main()   
  10. {   
  11.     father f;   
  12.     hello(&f);   
  13.     son s;   
  14.     hello(&f);  
  15.  
  16. }  
  17.  
  18. inline void father::show()   
  19. {   
  20.     cout<<"I am father"<
  21. }  
  22.  
  23. inline void son::show()   
  24. {   
  25.     cout<<"I am son"<
  26. }  
  27.  
  28. inline void son::sayhi()   
  29. {   
  30.     cout<<"Hi, I am son"<

这里,传入父类的指针将调用father::show(),传入子类的指针时,虽然进行了隐式的类型转化,但是由于子类在其继承的虚方法表中相应的位置覆盖了父类的show()方法,所用调用的实际上son::show()的内容。此时子类的方法表中不存在father::show()了,如果我们把virtual关键字去掉,那么father::show()和son::show()将同时存在与子类的方法表中。

那么如果子类做了父类没用做的事情,我们应如何调用了?

比如这里,我们的子类中实现了sayhi()方法,这是父类指针father*无法获取到的地址(实际是无法直接获取到,通过手动的指针偏移还是可以的,不知道是C++的优点还是缺点),这个地方,如果我们能够通过实际传入的对象指针类型进行操作就OK了。还好C++为我们提过了这个功能,那就是引入关键字dynamic_cast。

我们把hello()函数改写如下:

  1. void hello(father* fp)   
  2. {   
  3.     son* ps=dynamic_cast(fp);//将fp 转换为son*类型   
  4.     if(ps)//如果转换失败则返回0   
  5.         ps->sayhi();   
  6.     else   
  7.         fp->show();   

调用:

  1. int main()   
  2. {   
  3.     father f;   
  4.     hello(&f);//转换失败,执行else   
  5.     son s;   
  6.     hello(&s); //输出Hi,I am son  
  7.  

以下这篇博文对虚函数表讲解非常清楚:

http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx

原文链接:http://www.cnblogs.com/DanielZheng/archive/2010/11/22/1884431.html

【编辑推荐】

  1. C语言对象编程构思
  2. C语言中的面向对象思想
  3. C语言中的DIV的用法及DIVAB概念解析
  4. 详解Linux系统下搭建C语言开发环境
  5. 妙趣横生的算法(C语言实现)

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...