覆盖(成员函数覆盖):也称为重写,在派生类重新实现基类的虚函数。
- 特点:
- 不同的作用域(分别位于派生类和基类);
- 函数名相同;
- 参数相同;
- 返回值相同;
- 基类函数名中必须有virtual关键字,不能有static;
- 重写函数的权限访问限定符可以不同。
重载(函数重载):同一作用域中的函数名相同,参数不同的多个函数间构成重载。常成员函数和非常成员函数也可以构成重载。
- 特点:
- 同一个作用域;
- 函数名相同;
- 参数不同;
- 返回值可相同可不同;
- virtual关键字可有可无;
隐藏(成员函数隐藏):基类与派生类有同名函数,调用的时候总是调用派生类的函数,此时基类成员函数被隐藏。
- 特点:
- 不在同一作用域(分别位于派生类和基类);
- 函数名相同;
- 返回值可相同可不同;
- 参数不同时,不论有无virtual关键字,基类函数将被隐藏;
- 参数相同时,基类中无virtual关键字,基类函数被隐藏;
隐藏与覆盖:
- 相同点:派生类对象调用函数时,总是调用派生类实现的成员函数;
- 不同点:基类指针指向派生类对象时,覆盖情况下,基类指针调用的是派生类实现的函数;隐藏情况下,基类指针调用的函数是基类实现的函数。