C++重载、重写(覆盖)与隐藏的区别详解

南乔
南乔
发布时间:2026-10-15| 4人浏览过
原创

C++面向对象编程中,重载、重写(覆盖)和隐藏是极易混淆的三个概念,它们分别涉及同一作用域内的函数辨析以及派生类对基类函数的处理策略。正确区分三者对于实现正确的虚函数多态、避免意外编译错误至关重要。

重载(Overload):同域名同参异

重载发生在同一可访问区内(通常为同一个类)。当声明了多个具有相同名称但参数列表(类型、个数、顺序)不同的函数时,编译器根据传入的参数自动选择对应的函数版本。注意:仅返回值类型不同不构成重载。

class A {
public:
    void test(int i);           // OK
    void test(double i);        // OK:类型不同
    void test(int i, double j); // OK:个数不同
    int test(int i);            // Error:非重载,与第一个签名冲突
};

前四个定义互为重载关系。若将返回类型改为`int`而不改变参数,会导致编译错误,因为签名已存在。

隐藏(Hide):同名屏蔽规则

隐藏是指派生类的函数屏蔽了与其同名的基类函数。**这是一个严格的规则**:只要在派生类中定义了与基类同名的函数,无论参数是否一致,基类的所有同名重载版本都会被隐藏。

第1步:理解隐藏的触发条件

在基类中定义了同名函数后,如果在派生类中再次声明该名字的任何函数(参数不同也算),基类函数将被隐藏:

#include <iostream>
using namespace std;
class A {
public:
    void fun1(int i, int j) { cout << "A::fun1()" << endl; }
};
class B : public A {
public:
    void fun1(double i) { cout << "B::fun1()" << endl; }
};
int main() {
    B b;
    b.fun1(5);      // 调用B类函数
    b.fun1(1, 2);   // Error!A::fun1被隐藏
    return 0;
}

即使基类包含多个版本的`fun1`,派生类只要重写了其中一个名字,基类其他的版本均不可见。

重写(Override):基于虚函数的多态

重写用于实现运行时多态。其严格规定是:**函数名、参数列表、返回值类型必须与基类中被重写的函数完全一致**。唯一例外是协变(Covariant)指针或引用类型。此外,基类对应函数必须用virtual修饰,派生类也可以加上virtual关键字以显式表明意图。

第2步:通过基类指针/引用验证多态行为

当基类指针指向派生类对象时,调用重写过的虚函数会执行派生类的逻辑:

#include <iostream>
using namespace std;
class A {
public:
    virtual void fun3(int i) { cout << "A::fun3(" << i << ")" << endl; }
};
class B : public A {
public:
    // 重写基类fun3(int)
    void fun3(int i) override { cout << "B::fun3(int): " << i << endl; }
    // 此方法因与基类同名且未保持签名一致性,属于隐藏
    void fun3(double i) { cout << "B::fun3(double): " << i << endl; }
};
int main() {
    A *pa = new B();
    pa->fun3(3);          // 输出: B::fun3(int): 3 (调用重写版)
    B *pb = new B();
    pb->fun3(1.5);        // 输出: B::fun3(double): 1.5 (直接调用自身隐藏版)
    return 0;
}

关键对比与总结

  • 作用域:重载在同一类内;重写和隐藏跨越父子类。
  • 参数特征:重载必须参数不同;重写必须参数相同;隐藏只要函数名相同即发生,不论参数是否相同时。
  • 虚拟属性:重载不依赖虚拟特性;重写必须要求基类函数为virtual;隐藏与基类是否有虚拟函数无关。

以上就是关于C++中重载、重写(覆盖)与隐藏详细概念的解析与代码分析,更多关于C++对象模型的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。