C++ 重载、重写、隐藏的区别

发布于 2023-10-04 08:28:09 字数 2844 浏览 28 评论 0

概念解释:

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

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
                     // 错误:注意重载不关心函数返回类型
};

隐藏:是指派生类的函数屏蔽了与其同名的基类函数,主要只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

#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); ,这样就可以调用基类中的同名函数。

重写(覆盖):是指派生类中存在重新定义的函数。函数名、参数列表、返回值类型都必须同基类中被重写的函数一致,只有函数体不同。派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有 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 修饰,基类函数都是被隐藏,而不是重写。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

甜柠檬

暂无简介

0 文章
0 评论
19201 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文