文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-17 13:44

关注

如何理解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++多态的实现过程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯