为什么以下工作(我知道它不会工作时d.f(5)
):
#include <string>
#include <iostream>
struct A { int f(int a) { return a*a; } };
struct B : A { std::string f(std::string string) { return "Hello " + string; } };
struct Derived : B {};
int main()
{
Derived d;
std::cout << d.f("5") << std::endl;
return 0;
}
和下面的不是:
#include <string>
#include <iostream>
struct A { int f(int a) { return a*a; } };
struct B { std::string f(std::string string) { return "Hello " + string; } };
struct Derived : B, A {};
int main()
{
Derived d;
std::cout << d.f("5") << std::endl;
return 0;
}
您可以通过添加:
使最后一个示例工作using A::f;
using B::f;
在Derived
,但编译器不应该检查A
或B
,这将是相同的情况下,在第一个例子?
编辑:
错误提示:
main.cpp: In function ‘int main()’:
main.cpp:11:19: error: request for member ‘f’ is ambiguous
11 | std::cout << d.f("5") << std::endl;
| ^
main.cpp:4:16: note: candidates are: ‘int A::f(int)’
4 | struct A { int f(int a) { return a*a; } };
| ^
main.cpp:5:24: note: ‘std::string B::f(std::string)’
5 | struct B { std::string f(std::string string) { return "Hello " + string; } };
| ^
编辑2:我想我的问题表达错了,问题更多的是关于编译器在执行名称查找时如何准确区分多重继承和单一继承。
我现在明白了,谢谢。在前一种情况下,类没有一个方法的名称与被调用的方法名称匹配。接下来,类从一个类派生,派生的类有一个具有匹配名称的方法,该方法满足要查找的名称。
在后一种情况下,该类派生自另外两个类,并且它们都有一个具有匹配名称的方法。名称查找现在是不明确的。
但编译器不应该只检查
A
或B
这不是由编译器决定的。这些名称查找规则是在c++标准中指定的,编译器必须遵循这些名称查找规则。