下面的代码不能在(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;
};