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);

  

 

posted @ 2020-02-29 01:45  NeoZy  阅读(622)  评论(0编辑  收藏  举报