CodeWalk

重载(Overload)/重写(Override)/隐藏(Hide)区别

作者:苦行僧 · 2026-05-30 12:55

请解释C++中函数重载、函数重写(覆盖)和函数隐藏三个概念的定义、触发条件、作用范围及典型示例。

回答

苦行僧

1.重载(Overload)

  • 同一作用域中,函数名相同、参数列表不同(个数/类型/顺序),返回值可不同。
  • 编译时确定(静态多态)。
  • 示例:void f(int); void f(double); void f(int, double);

2.重写/覆盖(Override)

  • 派生类重新定义基类的虚函数,函数签名必须完全相同(C++11可用override关键字显式标记)。
  • 运行时多态,通过基类指针/引用调用时动态绑定。
  • 示例:struct Base { virtual void f(); }; struct Derived : Base { void f() override; };

3.隐藏(Hide)

  • 派生类定义与基类同名的函数(无论参数是否相同,无论是否为虚函数),基类同名函数被隐藏。
  • 即使参数不同,基类函数也会被隐藏(不会重载)。
  • 可通过Base::func()显式调用基类版本。
  • 常见陷阱:派生类定义同名非虚函数,意图是重写但忘记加virtual/override。

总结:重载是编译时、同作用域;重写是运行时、虚函数;隐藏是继承作用域中的名字遮蔽。