重载和重写的区分
这是 C++ 初中级阶段经常混淆的两个概念 —— 重载(Overload) 和 重写(Override)。我们可以用 对比 + 场景记忆 + 类比法 来深刻掌握。
🔁 一张表快速对比
特性 | 重载 Overload | 重写 Override |
---|---|---|
位置 | 同一个类中 | 子类中重写父类的虚函数 |
函数名 | 相同 | 相同 |
参数列表 | 必须不同(个数/类型/顺序) | 必须相同(类型、顺序都得一样) |
返回值 | 可以不同 | 要么相同,要么是协变返回类型 |
关键字要求 | 无需关键字 | C++11 起推荐用 override 明确标记 |
多态支持 | ❌ 不支持运行时多态(编译期确定) | ✅ 支持运行时多态(虚函数机制) |
用途场景 | 同功能但参数不同 | 父类接口规范化,子类行为定制化 |
🧠 场景式记忆法
🎯 1. 重载 Overload —— “多才多艺的同名函数”
关键词:同一个人,做同一件事,但工具不同。
例子: 你是一个打印函数 print()
,
你可能会收到不同的参数:
void print(int x);
void print(std::string s);
void print(double d);
-
在同一个作用域内;
-
参数不同;
-
编译时确定调用哪一个(编译期多态);
-
这就是 函数重载(Overload)。
🧬 2. 重写 Override —— “子类改写父类行为”
关键词:儿子有自己的做事风格。
例子:
class Animal {
public:virtual void speak() const { std::cout << "Animal speaks\n"; }
};class Dog : public Animal {
public:void speak() const override { std::cout << "Dog barks\n"; }
};
-
speak()
是父类的虚函数,子类Dog
重写了它的实现; -
要求:函数名、参数、
const
等签名必须一致; -
运行时决定调用哪个(运行时多态);
-
这就是 函数重写(Override)。
✅ 推荐加上 override
关键字,防止写错、增强代码自文档性。
🎨 类比法(生活记忆)
重载 Overload | 重写 Override |
---|---|
同一岗位下的多种技能 | 爸爸是老师,儿子长大后自己也当老师,但教学方法不同 |
一个客服,能处理多种问题 | 公司原有的政策被经理更新了,更符合实际需求 |
✅ 小总结口诀
“重载靠参数,重写靠继承。前者编译选,后者运行定。”