C++ 函数重载(Function Overloading)
定义
函数重载是指在同一作用域内,允许定义多个同名函数,但这些函数的参数列表必须不同(参数类型、数量或顺序不同)。编译器会根据调用时的实参自动匹配最合适的版本。
// 示例:函数重载
void print(int a) { // 版本1:接受 int
cout << "整数: " << a << endl;
}
void print(double a) { // 版本2:接受 double
cout << "浮点数: " << a << endl;
}
void print(string s) { // 版本3:接受 string
cout << "字符串: " << s << endl;
}
int main() {
print(10); // 调用版本1
print(3.14); // 调用版本2
print("Hello"); // 调用版本3
return 0;
}
函数重载的优点
- 提高代码可读性
相同功能的函数使用统一名称,逻辑更清晰(如print
处理不同类型数据)。 - 简化接口设计
无需为相似功能设计不同名称的函数(如printInt
、printDouble
)。 - 编译器自动匹配
根据实参类型选择正确版本,减少手动类型转换。
函数重载 vs 函数重写(Override)
特性 | 重载(Overload) | 重写(Override) |
---|---|---|
作用域 | 同一类或作用域内 | 派生类覆盖基类的虚函数 |
函数签名 | 必须不同(参数列表不同) | 必须相同(参数列表和返回类型一致) |
virtual 关键字 | 不需要 | 需要(基函数必须是 virtual ) |
多态性 | 编译时多态(静态绑定) | 运行时多态(动态绑定) |
示例对比
// 重载(同一类中)
class Calculator {
public:
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; } // 参数类型不同
};
// 重写(派生类覆盖基类虚函数)
class Base {
public:
virtual void show() { cout << "Base" << endl; }
};
class Derived : public Base {
public:
void show() override { cout << "Derived" << endl; } // 签名与基类相同
};
关键区别总结
- 目的不同
- 重载:扩展同名函数的功能(处理不同参数)。
- 重写:实现多态,子类自定义父类行为。
- 绑定时机
- 重载是编译时决定(静态多态),重写是运行时决定(动态多态)。
- 语法要求
- 重载不关心返回类型,重写必须完全匹配签名(包括返回类型协变)。
💡 记住:重载是“水平扩展”(同作用域),重写是“垂直覆盖”(继承关系)。