本质:重载为对于同一函数名不同参数的函数在同一类中的 不同表达、重写为跨两个类的同一参数的虚函数的不同表达、覆盖(隐藏)可以理解为同名函数不同参数(重写之外的)的函数在基类和派生类均出现然后派生类的函数把基类函数隐藏起来了
-
重载 (Overloading)
- 指的是在同一作用域内定义多个名称相同但参数列表(即函数签名)不同的函数。
- 返回类型不能用作区分重载函数的依据。
- 可以适用于普通函数和类的成员函数。
- 例子:
int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }
-
重写 (Overriding)
- 仅适用于派生类中的虚函数。
- 当派生类提供与基类中虚函数相同签名的函数定义时,就发生了函数覆盖。
- 覆盖的函数必须和基类中的虚函数有相同的函数签名和返回类型(或者是返回类型的协变,这是一个更高级的主题)。
- 例子:
class Base { public: virtual void show() { /* ... */ } }; class Derived : public Base { public: void show() override { /* ... */ } // 覆盖基类的show函数 };
-
隐藏(覆盖) (Hiding)
- 当派生类中的函数与基类中的函数具有相同的名称,但不是覆盖关系时,派生类中的函数会隐藏基类中的同名函数。
- 隐藏可以是有意的,但通常是由于不小心或错误导致的。
- 例子:
class Base { public: void func(int x) { /* ... */ } }; class Derived : public Base { public: void func(double y) { /* ... */ } // 隐藏了Base中的func(int) };
区分这些概念并明确它们的语义对于C++编程尤为重要,因为它们对于类的设计、继承和多态性行为有深远的影响。