多态描述的是使用基类的指针或引用操作多个类型的能力。
创新互联自成立以来,一直致力于为企业提供从网站策划、网站设计、成都做网站、网站设计、电子商务、网站推广、网站优化到为企业提供个性化软件开发等基于互联网的全面整合营销服务。公司拥有丰富的网站建设和互联网应用系统开发管理经验、成熟的应用系统解决方案、优秀的网站开发工程师团队及专业的网站设计师团队。
我们知道,子类的指针是可以隐式转化为父类的,所以我们在进行程序设计的时候如果要对一个未知的类型进行处理,可以在方法声明时把参数的类型声明为父类的指针。
这要我们就是实现了根据传入的类型执行不同的方法。这里的关键是子类在重写父类的虚方法时是在虚方法表的相应位置对父类虚方法实现覆盖。
举个例子:
头文件classFile.h:
- #ifndef classFile_Header_File
- #define classFile_Header_File
- class father
- {
- public:
- virtual void show();
- };
- class son: public father
- {
- public:
- void show();
- void sayhi();
- };
- #endif
这里我们在子类中对父类实现了override(C++没有提供override关键字,所以改写父类的方法要格外小心)。
TestPoly.cpp代码如下:
- #include
- #include"classFile.h"
- using namespace std;
- void hello(father* fp)
- {
- fp->show();
- }
- int main()
- {
- father f;
- hello(&f);
- son s;
- hello(&f);
- }
- inline void father::show()
- {
- cout<<"I am father"<
- }
- inline void son::show()
- {
- cout<<"I am son"<
- }
- inline void son::sayhi()
- {
- 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()函数改写如下:
- void hello(father* fp)
- {
- son* ps=dynamic_cast
(fp);//将fp 转换为son*类型 - if(ps)//如果转换失败则返回0
- ps->sayhi();
- else
- fp->show();
- }
调用:
- int main()
- {
- father f;
- hello(&f);//转换失败,执行else
- son s;
- hello(&s); //输出Hi,I am son
- }
以下这篇博文对虚函数表讲解非常清楚:
http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
原文链接:http://www.cnblogs.com/DanielZheng/archive/2010/11/22/1884431.html
【编辑推荐】
当前标题:实例演示C++多态的实现过程
文章分享:http://www.shufengxianlan.com/qtweb/news23/71873.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联