温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解C++多态的实现过程

发布时间:2021-11-24 13:08:30 来源:亿速云 阅读:172 作者:柒染 栏目:编程语言

如何理解C++多态的实现过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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

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

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

举个例子:

头文件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<iostream>   #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"<<endl;   }   inline void son::show()   {       cout<<"I am son"<<endl;   }   inline void son::sayhi()   {       cout<<"Hi, I am son"<<endl;   }

这里,传入父类的指针将调用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<son*>(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   }

关于如何理解C++多态的实现过程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI