zoukankan      html  css  js  c++  java
  • 关于函数重载、多态的一些错误总结

    一、重载

    class Base

    {
    public:
      void fun(float f)
      {
        cout << f << endl;
      }
    };
    class Derived: public Base
    {
    public:
      void fun(float f, float f2)
      {
        cout << f+1 << endl;
      }
    };
    int main(int argc, char *argv[])
    {
      Derived d;

      d.fun(3.14f);

    }

    上述程序本意是派生类重载基类的函数,但是事与愿违,编译器报错,错误信息是缺少参数。由此可见,派生类不能重载基类的同名函数,派生类的函数会将基类的所有同名函数全部都覆盖,重载函数只存在于同级中。

    二、多态的使用

    class Base

    {
    public:
      virtual void fun(float f)
      {
        cout << f << endl;
      }
    };
    class Derived: public Base
    {
    public:
      void fun(int f)
      {
        cout << f+1 << endl;
      }
    };
    int main(int argc, char *argv[])
    {
      Derived d;

      Base *base = &d;

      base->fun(3.14f);

    }

    上述程序本意是利用C++多态性,用指向base的指针调用Derived的对象的函数,但是事与愿违,没有实现功能。原因是Derived类中的void fun(int f) 参数类型是int,与基类不同,被识别成不同的函数。所以,要利用多态性,需要函数名和参数列表相同,当然,这个时候返回值也必须相同,否则报错(函数名和参数列表相同则被认为是同一函数)。

    三、多态的形式,伪多态

    class Base

    {
    public:
      virtual void fun(float f)
      {
        cout << f << endl;
      }
    };
    class Derived: public Base
    {
    public:
      void fun(float f, float f2)
      {
        cout << f+1 << endl;
      }
    };
    int main(int argc, char *argv[])
    {
      Derived d;

      Base *base = &d;

      base->fun(3.14f, 3.14f);   //错误

    }

    本程序与多态其实没有半毛钱关系,形似而已。从类定义可以看出,基类的fun与派生类的fun参数列表不同,所以仅仅是重写,不是多态。将派生类的对象的地址赋值给指向基类的对象的指针,之后希望用指针调用派生类对象的函数,但是C++的多态性(即用基类的指针调用派生类对象的函数)是在运行时发生的,在编译时基类指针调用的函数还是理解为基类对象的函数,而该程序中基类的fun函数没有2个参数,所以编译出错。

  • 相关阅读:
    2019-2020 20191232《信息安全专业导论》第七周学习总结
    求最大公约数伪代码
    2019-2020-1 20191232《信息安全专业导论》第五周学习总结
    2019-2020 20191232《信息安全专业导论》第二周学习总结
    冲刺分析
    冲刺第5天——json
    2020课程设计(基于gmssl的CA系统构建及应用)个人报告——20181211沈芮吉
    2020课程设计gmssl
    2020课程设计第三周任务——20181211沈芮吉
    2020课程设计第二周任务——20181211沈芮吉
  • 原文地址:https://www.cnblogs.com/bigfish2013/p/3406888.html
Copyright © 2011-2022 走看看