C++ 派生类覆盖重载基类函数
派生类希望基类重载函数可见,情况有三种:
a)派生类中覆盖某个版本,则某个版本可见,全部都覆盖重写,则全部版本可见。
b)派生类中一个也不覆盖,则全部基类版本可见。
c)派生类需要添加新的重载版本,同时又需要可见基类的重载版本,此时并不是必须全部覆盖重写全部版本。可在派生类中用using声明基类重载的函数。
说明:对派生类没有重新定义的重载版本的访问实际上是对using声明点的访问。
两种注意点:
a)指向派生类的基类指针或引用,不可调用派生类中的重载函数。
原因:静态编译名字查找先于类型检查,在基类中找到同名函数,就不喊在派生类中继续找,而基类不存在目标调用形式的函数
b)若不用using声明基类的重载版函数,派生类对象不可调用基类的重载版本。
原因:派生类的函数,隐藏了基类的同名函数。
所以如果基类的某个函数f有多个重载版本,如果其派生类想使用所有这些版本的f函数(注意是直接调用f而不是显式调用基类::f)的话,必须覆盖所有这些f,或者一个都不覆盖。
这样就很烦,那么我们可以使用using声明。
假如基类为Base,派生类为Derived,其中Base内部定义有多个不同版本的重载函数f,如f(int),f(char),f(string)...
在基类里面,我们加上一句:
using Base::f
这样,我们就可以直接用Derived对象/指针/引用调用Base类的所有f函数了。
如:
Derived x; x.f(int); x.f(char);
进击的小🐴农