重写、重载和隐藏的区别

  1. 重载:是指同一可访问区内被声明几个具有不同参数列(参数的类型、个数、顺序)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。
    class A

    {

    public:

      void fun(int tmp);

      void fun(float tmp); // 重载 参数类型不同(相对于上一个函数)

      void fun(int tmp, float tmp1); // 重载 参数个数不同(相对于上一个函数)

      void fun(float tmp, int tmp1); // 重载 参数顺序不同(相对于上一个函数)

      int fun(int tmp); // error: 'int A::fun(int)' cannot be overloaded 错误:**注意重载不关心函数返回类型**
  1. 隐藏:是指派生类的函数屏蔽了与其同名的基类函数,主要只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
    #include <iostream>

    using namespace std;

    class Base

    {

    public:

      void fun(int tmp, float tmp1) { cout << "Base::fun(int tmp, float tmp1)" << endl; }

    };

    class Derive : public Base

    {

    public:

      void fun(int tmp) { cout << "Derive::fun(int tmp)" << endl; } // 隐藏基类中的同名函数

    };

    int main()

    {

      Derive ex;

      ex.fun(1); // Derive::fun(int tmp)

      ex.fun(1, 0.01); // error: candidate expects 1 argument, 2 provided

      return 0;

    }

说明:上述代码中 ex.fun(1, 0.01); 出现错误,说明派生类中将基类的同名函数隐藏了。若是想调用基类中的同名函数,可以加上类型名指明 ex.Base::fun(1, 0.01);,这样就可以调用基类中的同名函数。

  1. 重写(覆盖):是指派生类中存在重新定义的函数。函数名、参数列表、返回值类型都必须同基类中被重写的函数一致,只有函数体不同。派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有 virtual 修饰
   #include <iostream>

    using namespace std;

    class Base

    {

    public:

      virtual void fun(int tmp) { cout << "Base::fun(int tmp) : " << tmp << endl; }

    };

    class Derived : public Base

    {

    public:

      virtual void fun(int tmp) { cout << "Derived::fun(int tmp) : " << tmp << endl; } // 重写基类中的 fun 函数

    };

    int main()

    {

      Base *p = new Derived();

      p->fun(3); // Derived::fun(int) : 3

      return 0;

    }

重写和重载的区别:

  • 范围区别:对于类中函数的重载或者重写而言,重载发生在同一个类的内部,重写发生在不同的类之间(子类和父类之间)。
  • 参数区别:重载的函数需要与原函数有相同的函数名、不同的参数列表,不关注函数的返回值类型;重写的函数的函数名、参数列表和返回值类型都需要和原函数相同,父类中被重写的函数需要有 virtual 修饰。
  • virtual 关键字:重写的函数基类中必须有 virtual关键字的修饰,重载的函数可以有 virtual 关键字的修饰也可以没有。

隐藏和重写,重载的区别:

  • 范围区别:隐藏与重载范围不同,隐藏发生在不同类中。
  • 参数区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定相同;当参数不同时,无论基类中的函数是否被 virtual 修饰,基类函数都是被隐藏,而不是重写。
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值