我在类f()
和子类A
中有方法B
,我在其中添加了方法f(int)
。如果我理解的话,我在f()
中同时拥有f(int)
和B
。我想在f()
的另一种方法中使用B
,但这是一个错误。
class A {
public:
int f() {
return 3;
}
};
class B : public A {
int x;
public:
int f(int a) {
return a * 2;
}
void g() {
x = f();
// no matching function for call to 'B::f()'
// candidate is 'int B::f(int)'
}
};
如果我从f(int)
移除B
,则可以使用。
答案 0 :(得分:5)
如果我理解的话,我
f()
f(int)
和B
都有。{/ p>
不,A::f()
隐藏在B
的范围内。因为可以在类f
的范围内找到名为B
的成员函数,然后名称查找将停止,所以找不到基类版本f
并考虑超载分辨率。最后编译失败,因为函数参数不匹配。这是一种隐藏的名字。
您可以通过A::f
介绍using
。
class B : public A {
int x;
public:
using A::f;
int f(int a) {
return a * 2;
}
void g() {
x = f();
}
};
如果我从
f(int)
移除B
,则可以使用。
然后名称查找在类B
的范围内失败,将检查更多的范围,并在基类A::f
的范围内找到A
,然后它运行良好
答案 1 :(得分:1)
您可以使用范围解析运算符::
将x = f();
替换为x = A::f();
class A {
public:
int f() {
return 3;
}
};
class B : public A {
int x;
public:
int f(int a) {
return a * 2;
}
void g() {
x = A::f();
}
};