鉴于以下示例,为什么我必须显式使用语句 b->A::DoSomething()
而不仅仅是 b->DoSomething()
?
编译器的重载决议不应该弄清楚我在说哪种方法吗?
我正在使用 Microsoft VS 2005。(注意:在这种情况下使用虚拟没有帮助。)
class A
{
public:
int DoSomething() {return 0;};
};
class B : public A
{
public:
int DoSomething(int x) {return 1;};
};
int main()
{
B* b = new B();
b->A::DoSomething(); //Why this?
//b->DoSomething(); //Why not this? (Gives compiler error.)
delete b;
return 0;
}
最佳答案
这两个“重载”不在同一个范围内。默认情况下,编译器只考虑可能的最小名称范围,直到找到名称匹配。参数匹配在之后完成。在您的情况下,这意味着编译器会看到 B::DoSomething
。然后它尝试匹配参数列表,但失败了。
一种解决方案是将重载从 A
拉到 B
的范围内:
class B : public A {
public:
using A::DoSomething;
// …
}
关于C++ 重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72010/