重载(Overload)/重写(Override)/隐藏(Hide)区别
请解释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。
总结:重载是编译时、同作用域;重写是运行时、虚函数;隐藏是继承作用域中的名字遮蔽。