1.86、函数重载和函数重写有什么区别?

函数重载(Overload)和函数重写(Override)是C++中两个不同的概念,面试中常用来考察对函数多态和作用域的理解。它们的区别可以从以下几个维度来把握:


1. 定义和发生的作用域

  • • 函数重载
    同一个类(同一作用域)内,函数名相同,但参数列表(参数个数、类型或顺序)不同。编译器通过参数列表区分调用哪个函数。
    与返回值无关,virtual关键字可有可无。
  • • 函数重写(覆盖)
    发生在基类和派生类之间,派生类重新定义基类的虚函数。函数名、参数列表、返回值必须完全相同,且基类函数必须是virtual
    实现运行时多态,调用时根据对象的动态类型选择函数版本。

2. 参数和返回值要求

特性 函数重载 函数重写(覆盖)
参数列表 必须不同 必须相同
返回值 可以不同 必须相同(或协变返回类型)
virtual关键字 可有可无 基类必须有,派生类可有可无

3. 作用和机制

  • • 函数重载是编译时多态,编译器根据调用时参数类型和数量决定调用哪个函数版本。
  • • 函数重写是运行时多态,通过虚函数表(vtable)实现,调用时根据对象的实际类型决定执行哪个版本。

4. 访问权限和作用域

  • • 函数重载发生在同一作用域内(同一个类),不会隐藏其他函数。
  • • 函数重写发生在不同作用域(基类和派生类),派生类函数覆盖基类虚函数。
  • • 注意:如果派生类定义了与基类同名但参数不同的函数,会隐藏基类所有同名函数(函数隐藏),这与重载和重写不同。

5. 简单示例

class Base {
public:
    virtual void func(int x) std::cout func(10);      // 调用 Derived::func(int),运行时多态(重写)
    d.func('a');      // 调用 Derived::func(char),重载
    d.func(3.14);     // 编译错误,Base::func(double)被隐藏
}

面试考察重点总结

  • • 函数重载关注同一类内函数名相同,参数不同,编译时静态绑定。
  • • 函数重写关注基类虚函数被派生类重新定义,参数和返回值必须匹配,实现运行时多态。
  • • 理解函数隐藏(重定义)与重载、重写的区别,避免混淆。
  • • 掌握virtual关键字对函数重写的必要性。
  • • 能结合代码准确说明调用时函数选择的机制。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END