zoukankan      html  css  js  c++  java
  • C++多态性的理解

    本文章转载来自:http://www.sollyu.com/?p=627

    代码

    #include <iostream.h>
    class Animal
    {
    public:
     void eat()
     {
      cout<<"animal eat"<<endl;
     }
     void sleep()
     { 
      cout<<"animal sleep"<<endl;
     }
     void breathe()
     { 
      cout<<"animal breathe"<<endl;
     }
    };
    class Fish :  public Animal
    {
     void breathe()
     {
      cout<<"fish bubble"<<endl;
     }
    };
    void fn(Animal *pAn)
    {
     pAn->breathe();
    }
    void main()
    {
     Fish fh;
     Animal *pAn;
     pAn=&fh;
     fn(pAn);  
    }
    

    说明

    我们先来看看我们这个程序的运行结果:animal breathe 这里的结果是这样来理解的,因为fish是继承animal而来的,在内存区域中,fish的内存模型如下:

    C++多态性的理解

    故我们在将我们fish类的对象的指针传给我们的animal类的对象的指针的时候,我们系统执行的时候,系统调用的依然是我们积累里面的方法, 因为我们可以明显的发现我们的fish和animal的指针的首地址是一样的,故我们的运行时调用的就是我们的基类中的那个方法。

    我们再来看看我们的另外一个程序段代码:

    #include <iostream.h>
    class Animal
    {
    public:
        void eat()
        {
            cout<<"animal eat"<<endl;
        }
        void sleep()
        { 
            cout<<"animal sleep"<<endl;
        }
        virtual void breathe()
        { 
            cout<<"animal breathe"<<endl;
        }
    };
    class Fish :  public Animal
    {
        void breathe()
        {
            cout<<"fish bubble"<<endl;
        }
    };
    void fn(Animal *pAn)
    {
        pAn->breathe();
    }
    void main()
    {
        Fish fh;
        Animal *pAn;
        pAn=&fh;
        fn(pAn);   
    }
    

    程序的运行结果是:fish bubble 这里我们可以利用c++多态性来解释,我们加上virtual以后,这个基类中的方法变成了虚函数,系统在进行编译时,我们会先去调用我们基类中的方法,此时如果我们的子类中没有我们这个方法,我们还是会去调用我们基类中的方法。

    总结

    在利用我们的c++多态性的时候,我们这样来理解,当我们的基类中的方法为virtual时,我们的子类中有方法的我们会先去调用我们的子类中的相应的方法,如果我们的子类中没有的我们的系统才会去调用我们的父类的响应的方法。

    本篇文章由 爱推 发送

  • 相关阅读:
    js 判断字符串中是否包含某个字符串
    MySQL批量更新数据
    js实现字符串切割并转换成对象格式保存到本地
    C#用openfiledialog文件和savefileDialog打开和保存文件
    C#中e.Cancel,e.Handled的区别与应用
    登录窗体与主窗体的关闭
    C#中WinForm程序退出方法技巧总结
    c# 如何获取项目的根目录
    C# Winform中WndProc 函数作用
    SqlDataAdapter.Update批量数据更新
  • 原文地址:https://www.cnblogs.com/sollyu/p/3869080.html
Copyright © 2011-2022 走看看