C++基类子类的函数关系——重载、重定义、覆盖/重写、隐藏
重载是指在同一作用域内,根据不同的参数列表(参数类型、参数个数或参数顺序)来定义多个同名的函数。
基类和派生类不是同一作用域,这时在派生类定义与基类同名的函数叫做重定义函数。
重定义又根据基类函数是否为虚函数,分为隐藏和覆盖(也叫做重写)两种情况。
隐藏是指,基类函数不是虚函数,派生类中定义了与基类同名的该函数。
隐藏时在基类指针指向派生类对象时,调用的是派生类的函数;
而在派生类指针指向基类对象时,调用的是基类的函数。
覆盖(也叫做重写)指的是,基类函数是虚函数,派生类中定义了与基类同名、参数相同的该函数。
重写时在基类指针指向派生类对象时,调用的是派生类的函数;
而在派生类指针指向基类对象时,调用的是基类的函数。
可以清楚看到,无论是隐藏还是覆盖/重写,无论是用的基类指针还是派生类指针,调用谁的函数关键还是在于指向的对象是基类对象还是派生类对象。
多态性有两种主要形式:编译时多态性(静态多态性、重载)和运行时多态性(动态多态性、覆盖、重写)。
值得单独说的是,运行时多态是通过虚函数和基类指针/引用来实现的,允许基类指针/引用指向派生类对象,并在调用虚函数时根据指向的对象类型,动态地选择执行派生类的函数。