如果它们在C ++中的基类和派生类中都被重载,我似乎无法直接使用派生类中的基类的方法。以下代码生成错误no matching function for call to ‘Derived::getTwo()’
。
class Base {
public:
int getTwo() {
return 2;
}
int getTwo(int, int) {
return 2;
}
};
class Derived : public Base {
public:
int getValue() {
// no matching function for call to ‘Derived::getTwo()’
return getTwo();
}
int getTwo(int) {
return 2;
}
};
如果我将return getTwo();
更改为return ((Base*) this)->getTwo()
,它会起作用,但这看起来很难看。我该如何解决这个问题?
P.S。如果重要的话,我使用g ++ 4.7和std = gnu ++ c11选项。
答案 0 :(得分:1)
或者:
class Derived : public Base {
public:
using Base::getTwo; // Add this line
int getValue() {
// no matching function for call to ‘Derived::getTwo()’
return getTwo();
}
int getTwo(int) {
return 2;
}
}
或者
return Base::getTwo();
答案 1 :(得分:0)
这就是C ++中名称查找的工作原理:
namespace N1
{
int getTwo();
int getTwo(int, int);
namespace N2
{
int getTwo(int);
namespace N3
{
call getTwo(something char*);
}
}
}
目前的背景是N3。此图层上没有getTwo
。好的,转到上层。 N2包含getTwo
的一个定义。编译器将尝试使用此定义,而不会搜索上层上下文。来自N2的getTwo
隐藏了所有上层的getTwo
的所有定义。有时这会导致与重载方法混淆。
如果添加using Base::getTwo;
,实际上是在内部上下文中添加定义代理。上层语境temsellves的定义不可见。但代理是可见的。