以下代码片段在编译过程中产生了“对 foo 的模糊调用”错误,我想知道是否有任何方法可以在不完全限定对 foo 的调用的情况下解决此问题:
#include <iostream>
struct Base1{
void foo(int){
}
};
struct Base2{
void foo(float){
}
};
struct Derived : public Base1, public Base2{
};
int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;
}
所以,问题如题。想法?我的意思是,以下操作完美无缺:
#include <iostream>
struct Base{
void foo(int){
}
};
struct Derived : public Base{
void foo(float){
}
};
int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;
}
最佳答案
成员查找规则在第 10.2/2 节中定义
The following steps define the result of name lookup in a class scope,
C
. First, every declaration for the name in the class and in each of its base class sub-objects is considered. A member namef
in one sub-objectB
hides a member namef
in a sub-objectA
ifA
is a base class sub-object ofB
. Any declarations that are so hidden are eliminated from consideration. Each of these declarations that was introduced by a using-declaration is considered to be from each sub-object ofC
that is of the type containing the declara-tion designated by the using-declaration. If the resulting set of declarations are not all from sub-objects of the same type, or the set has a nonstatic member and includes members from distinct sub-objects, there is an ambiguity and the program is ill-formed. Otherwise that set is the result of the lookup.
class A {
public:
int f(int);
};
class B {
public:
int f();
};
class C : public A, public B {};
int main()
{
C c;
c.f(); // ambiguous
}
因此您可以使用using
声明A::f
和B::f
来解决这种歧义
class C : public A, public B {
using A::f;
using B::f;
};
int main()
{
C c;
c.f(); // fine
}
第二个代码可以完美运行,因为 void foo(float)
在 C 的范围内。实际上 d.foo(5);
调用 void foo(float)
而不是 int
版本。
关于c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560944/