2
void f()
{}

struct A
{
    void f()
    {}
};

struct B : A
{
    B()
    {
        f(); // A::f() is always called, and ::f is always ignored 
    }
};

int main()
{
    B();
}

As the class B's designer, I MIGHT NOT know the fact that B's base class, i.e. A, has a member function A::f, I just know ::f, and call ::f is just what I want.

What I expects is the compiler gives an error because of ambiguity of calling f. However, the compiler always chooses A::f and ignore ::f. I think this might be a big pitfall.

I just wonder:

Why does the overload resolution of member functions exclude the global functions?

What's the rationale?

4

2 回答 2

4

作为 B 类的设计者,我可能不知道 B 的基类

我不同意。

为什么成员函数的重载解析会排除全局函数?

因为这两个重载属于两个不同的作用域,编译器选择了相同作用域的重载。阅读§3.4.1。内部f(相同)范围隐藏外部的f.

理由是什么?

要有一个坚实的规则。我们更喜欢在同一范围内工作。除非我们明确地想从其他地方调用一个对象。

在一个打电话给亚历克斯的家庭中,他们希望他们的小男孩亚历克斯进来,而不是马其顿的亚历山大三世

于 2013-10-26T08:45:18.110 回答
4

这就是重载解析的工作原理,这很好

想象一下,你真的有一个大项目,大量的相互依赖,第三方代码和跨模块包含。在这个巨大的混乱中,你有一个你知道有效的课程。它已经完美运行了 5 年,它高效、易于阅读和清洁。你不想碰它。然后升级模块,并开始出现编译器错误。不好了!该模块(您无法控制)DoAmazingStuff()在全局命名空间中引入了一个新功能。与我们类中的方法名称相同。您将不得不重构它,因为现在您不能再为类成员使用相同的名称。无赖!

于 2013-10-26T08:50:18.497 回答