1. 重载(Overload)
定义
在同一作用域内(如类内部或全局作用域),定义多个同名函数,但它们的参数列表不同(参数类型、数量或顺序不同)。
重载是编译时多态的一种体现。
特点
函数名相同,参数列表不同。
返回类型可以不同,但仅返回类型不同不足以构成重载。
可以是成员函数,也可以是全局函数。
class Calculator {
public:
int add(int a, int b) { // 重载1:两个int参数
return a + b;
}
double add(double a, double b) { // 重载2:两个double参数
return a + b;
}
int add(int a, int b, int c) { // 重载3:三个int参数
return a + b + c;
}
};
int main() {
Calculator calc;
calc.add(1, 2); // 调用重载1
calc.add(1.5, 2.5); // 调用重载2
calc.add(1, 2, 3); // 调用重载3
}
2. 重写(Override)
定义
在派生类中重新定义基类的虚函数,要求函数名、参数列表和返回类型完全相同。
重写是运行时多态的核心机制,通过虚函数(virtual)实现动态绑定。
特点
必须发生在继承关系中(基类与派生类)。
基类函数必须声明为 virtual。
派生类函数使用 override 关键字(C++11 起)明确表示重写。
class Animal {
public:
virtual void speak() { // 基类虚函数
std::cout << "Animal sound" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() override { // 重写基类虚函数
std::cout << "Dog barks" << std::endl;
}
};
int main() {
Animal* animal = new Dog();
animal->speak(); // 输出: Dog barks(动态绑定)
delete animal;
}
特性 |
重载(Overload) |
重写(Override) |
作用域 |
同一类或同一作用域 |
基类与派生类之间 |
函数签名 |
参数列表必须不同 |
函数名、参数列表、返回类型必须完全相同 |
多态性 |
编译时多态(静态绑定) |
运行时多态(动态绑定) |
继承关系 |
不需要 |
必须存在继承关系 |
虚函数 |
不需要 |
基类函数必须为 virtual |
关键字 |
无 |
override(C++11 起) |