重载
- 相同的范围(在同一个类中)
- 函数名相同
- 参数不同
- virtual关键字可有可无
重载与继承、隐藏很好区分,因为重载函数在同一个类中
举例说明
#include <iostream> using namespace std; class Base { public: void f(int x) {cout << "Base f(int)" << x << endl;} void f(float x) {cout << "Base f(float)" << x << endl;} }; int main() { Base b; b.f(42); b.f(3.14f); }
结果
继承
- 不同的范围(分别位于基类和派生类)
- 函数名相同
- 参数相同
- 基类必须有virtual关键字
隐藏
- 如果派生类的函数与基类的函数同名、同参数,基类函数不带有virtual关键字
- 如果派生类函数与基类的函数同名、不同惨,不管基类函数带不带virtual关键字
归纳起来
同名前提(不同名免谈)
- 同参+virtual——继承
- 同参+无virtual / 不同参 —— 隐藏
强调:只要不是继承(virtural+同参)就是隐藏,隐藏后,如果基类、派生类有相同函数名,派生类对象只能调用派生类的函数。
#include <iostream> #include <string> using namespace std; class base { public: virtual void test(int a, int b) { cout << a << " " << b << endl; } }; class derived : public base { public: void test(int a) { cout << a << endl; } //隐藏 }; int main() { derived m; m.test(45); m.test(4, 5); //error:派生类中没有俩参数的 }