为什么派生类中的重写函数隐藏基类的其他重载?

为什么派生类中的重写函数隐藏基类的其他重载?

考虑一下守则:

#include <stdio.h>class Base {public: 
    virtual void gogo(int a){
        printf(" Base :: gogo (int) \n");
    };

    virtual void gogo(int* a){
        printf(" Base :: gogo (int*) \n");
    };};class Derived : public Base{public:
    virtual void gogo(int* a){
        printf(" Derived :: gogo (int*) \n");
    };};int main(){
    Derived obj;
    obj.gogo(7);}

得到了这个错误:

>g++ -pedantic -Os test.cpp -o test
test.cpp: In function `int main()':
test.cpp:31: error: no matching function for call to `Derived::gogo(int)'
test.cpp:21: note: candidates are: virtual void Derived::gogo(int*) 
test.cpp:33:2: warning: no newline at end of file
>Exit code: 1

在这里,派生类的函数将使基类中所有同名函数(而不是签名函数)黯然失色。不知何故,C+的这种行为看起来不太好。不是多态。


猛跑小猪
浏览 643回答 4
4回答

炎炎设计

名称解析规则说,名称查找在找到匹配名称的第一个作用域中停止。这时,重载解析规则就会出现,以找到可用函数的最佳匹配。在这种情况下,gogo(int*)在派生类作用域中找到(单独),并且由于没有从int到int*的标准转换,查找失败。解决方案是通过派生类中的Using声明引入Base声明:using&nbsp;Base::gogo;.将允许名称查找规则查找所有候选项,因此重载解析将按照您的预期进行。

蛊毒传说

这是“设计”。在C+中,此类方法的重载解析如下所示。从引用的类型开始,然后转到基类型,找到第一个类型,它有一个名为“gogo”的方法。仅考虑那种类型上名为“gogo”的方法,就可以找到匹配的重载。因为派生没有一个名为“gogo”的匹配函数,所以重载解析失败。
打开App,查看更多内容
随时随地看视频慕课网APP