g ++在基类中找不到重载函数

use*_*939 1 c++ inheritance gcc

以下不用(GCC)4.8.2编译.它抱怨这样:

错误:没有匹配函数来调用'classderivedderived :: dump(int)'

#include <iostream>

class classbase{
public:
    void print() {std::cout << "base\n";}
    virtual void dump() = 0;
    void dump(int i) {std::cout << i << " blech\n";}
    int i;
};

class classderived : public classbase {
public:
    int ii;
};

class classderivedderived : public classderived {
public:
    void dump() {std::cout << "blah\n"; dump(10);}
    int iii;
};

int main() {
    classderivedderived yellow;
    yellow.i = 5;
    yellow.dump();
}
Run Code Online (Sandbox Code Playgroud)

它确实编译并运行

(1) dump(10) => classbase::dump(10)

要么

(2) dump(10) => puddledump(10) and void dump(int i) => void puddledump(int i)

这应该发生吗?为什么gcc不能dump(10)根据参数类型解析函数调用,就像任何其他函数调用一样?我认为它将解决该调用,因为它dump(int)是由于开始成为classbase的成员而导致的类的成员函数.

qua*_*dev 7

是的,这是假设发生,因为你的另一功能的重新声明命名dump()classderivedderived隐藏继承dump(int).拥有不同的签名并不重要,它是隐藏的.

将其纳入范围using:

class classderivedderived : public classderived 
{
  public:
    using classderived::dump;
    void dump() {std::cout << "blah\n"; dump(10);}
    int iii;
};
Run Code Online (Sandbox Code Playgroud)