C++中函数重载、覆盖与隐藏的区别详解

Aria
Aria
发布时间:2026-10-14 | 5人浏览过
原创

C++面向对象编程中,同名函数的处理机制是核心难点之一。理解函数重载、覆盖(重写)与隐藏的区别,对于实现多态性和避免编译错误至关重要。本文将逐一剖析三者的定义、触发条件及关键差异。

函数重载 (Overloading)

函数重载是指在同一个作用域内(通常是在同一个类或全局命名空间),定义多个同名但参数列表不同的函数。编译器根据调用时传入的参数类型和数量来自动匹配最合适的函数版本。

第1步:确认重载的特征

要判断一组函数是否构成重载,需同时满足以下条件:

  • 相同范围:所有函数必须位于同一个类中或同一命名空间下。
  • 名字相同:函数标识符名称一致。
  • 参数不同:参数类型、个数或顺序至少有一项不同。注意:仅返回值不同不足以构成重载。
  • VIRTUAL无关:virtual关键字的存在与否不影响重载的判断,可有可无。

函数覆盖 (Overriding / Rewrite)

函数覆盖(也称重写)是指派生类重新定义基类中已存在的虚函数。这是实现运行时多态的基础。当通过基类指针或引用调用该函数时,将根据实际指向的对象类型执行对应的派生类函数。

第2步:确认覆盖的特征

函数覆盖必须严格遵循以下规则:

  • 不同范围:基类函数与派生类函数分别位于基类和派生类中。
  • 名字相同:函数名称完全一致。
  • 参数相同:参数列表必须完全一致。
  • VIRTUAL必要:基类中的被覆盖函数必须声明为 virtual。若基类非虚,则不构成覆盖,而是进入“隐藏”范畴。

函数隐藏 (Hiding)

隐藏是指派生类的函数屏蔽了与其同名的基类函数。此时,无论是否存在多态特性,基类函数在派生类的作用域中将不可见(除非使用作用域解析符 :: 显式调用)。隐藏规则常导致初学者困惑,因为它与重载和覆盖的字面特征有重叠。

第3步:识别隐藏的两种情况

以下是判断基类函数是否被派生类函数隐藏的关键规则:

情况A:参数不同

如果派生类函数与基类函数同名,但参数不同,那么无论基类函数是否有 virtual 关键字,基类函数都会被隐藏。

注意:这与重载不同,因为它们处于不同的类作用域中,无法形成重载关系。

情况B:参数相同但无Virtual

如果派生类函数与基类函数同名,且参数也相同,但基类函数没有 virtual 关键字,那么基类函数同样会被隐藏。

注意:这不同于覆盖。因为缺少虚函数特性,派生类函数只是独立的新函数,并未接管基类的虚函数表slot。

总结

区分这三者最快的方法是看两个维度:作用域和参数。

  1. 同一作用域 + 参数不同 = 重载。
  2. 不同作用域 + 参数相同 + 基类Virtual = 覆盖(实现多态)。
  3. 不同作用域 + (参数不同 OR 基类非Virtual) = 隐藏(基类函数不可见)。

以上就是C++中函数重载、覆盖与隐藏的详细内容,更多关于C++面向对象编程的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表