c++基础(虚函数)

作者 : 开心源码 本文共1826个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共141人阅读

Cplusplus-tutorial-in-hindi.jpg

虚函数在 c++ 的继承体系中是一个非常重要概念,让我们可以在子类中复写父类的方法。学到这里我还不知道在 c++ 中能否有笼统类的概念,那么学习过虚函数我们就知道通过(纯)虚函数可以实现 java 中的笼统类,随后详情。
上代码通过代码进行解释。

#include <iostream>#include <string>class Shape{  public:    std::string GetName() { return "Shap"; }};class Rect : public Shape{  private:    std::string m_Name;  public:    Rect(const std::string &name) : m_Name(name) {}    std::string GetName() { return m_Name; }};int main(int argc, char const *argv[]){    Shape *s = new Shape();    std::cout << s->GetName() << std::endl;    Rect *r = new Rect("rectangle");    std::cout << r->GetName() << std::endl;    std::cin.get();}

这里分别定义了 ShapeRect两个类,并且Rect继承了Shape,同时这两个类中都有GetName()方法。

Shaprectangle

分别调用Shape的实例sRect的实例·rGetName输出如上,正确无误,是我们想要的效果。

class Rect : public Shape{  private:    std::string m_Name;  public:    Rect(const std::string &name) : m_Name(name) {}    std::string GetName() { return m_Name; }};int main(int argc, char const *argv[]){    Shape *s = new Shape();    std::cout << s->GetName() << std::endl;    Shape *r = new Rect("rectangle");    std::cout << r->GetName() << std::endl;    std::cin.get();}

向上转型后发现 Rect 实例 r 的 GetName 输出为 Shap 而不是 rectangle 。

ShapShap
void PrintName(Shape *s){    std::cout << s->GetName() << std::endl;}int main(int argc, char const *argv[]){    Shape *s = new Shape();    // std::cout << s->GetName() << std::endl;    Shape *r = new Rect("rectangle");    // std::cout << r->GetName() << std::endl;    PrintName(s);    PrintName(r);    std::cin.get();}

这里一下代码,让代码容易被了解和阅读,这里函数PrintName接收Shape 的引用作为参数。
为什么发生这样问题,其实也很好了解,我们定义函数PrintName接收Shape类型的引用做为参数,所以当调用GetName方法时候就会从Shape类型中查找能否存在该方法而后将其调用。
要想让Rect调用自己的的getName方法而非其父类的GetName的方法,就需要使用到虚函数,虚函数会根据Vtable来进行方法调用分配,这样我们即可以根据类型调用到自己的方法。
现在简单详情一下,随后会深入详情虚函数

class Shape{  public:    virtual std::string GetName() { return "Shap"; }};class Rect : public Shape{  private:    std::string m_Name;  public:    Rect(const std::string &name) : m_Name(name) {}    std::string GetName() override { return m_Name; }};

要实现虚函数需要两个步骤进行修改

  • 在父类中,在函数GetName()前面加上virtual
  • 在子类中,在函数GetName()后面加上override
    再次运行编译运行程序就得到我们想要结果了
Shaprectangle

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » c++基础(虚函数)

发表回复