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

g++ does not find overloaded function in base class

本文关键字:重载 函数 找不到 基类 g++      更新时间:2023-10-16

下面的代码不能在(GCC) 4.8.2中编译。它的报错是这样的:

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

#include <iostream>
class classbase{
public:
    void print() {std::cout << "basen";}
    virtual void dump() = 0;
    void dump(int i) {std::cout << i << " blechn";}
    int i;
};
class classderived : public classbase {
public:
    int ii;
};
class classderivedderived : public classderived {
public:
    void dump() {std::cout << "blahn"; dump(10);}
    int iii;
};
int main() {
    classderivedderived yellow;
    yellow.i = 5;
    yellow.dump();
}

编译并运行

(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)是classderived的成员函数

是的,这应该发生,因为您在classderivedderived中重新声明另一个名为dump()的函数是隐藏继承的dump(int)。拥有不同的签名并不重要,它是隐藏的。

使用using:

将其纳入范围
class classderivedderived : public classderived 
{
  public:
    using classderived::dump;
    void dump() {std::cout << "blahn"; dump(10);}
    int iii;
};