C++ 为什么成员函数的重载解析排除了全局函数?
作为类C++ 为什么成员函数的重载解析排除了全局函数?,c++,function,namespaces,overloading,overload-resolution,C++,Function,Namespaces,Overloading,Overload Resolution,作为类B的设计者,我可能不知道B的基类,即A,有一个成员函数A::f,我只知道::f,调用::f正是我想要的 我所期望的是,由于调用f的模糊性,编译器会给出一个错误。但是,编译器总是选择A::f并忽略::f。我认为这可能是一个很大的陷阱 我只是想知道: 为什么成员函数的重载解析排除了全局函数? 理由是什么? 作为B类的设计者,我可能不知道B的基类 我不同意 为什么成员函数的重载解析会排除 全球功能 因为这两个重载属于两个不同的作用域,并且编译器选择相同作用域的重载。阅读§3.4.1。内部(相同)
B
的设计者,我可能不知道B
的基类,即A
,有一个成员函数A::f
,我只知道::f
,调用::f
正是我想要的
我所期望的是,由于调用f
的模糊性,编译器会给出一个错误。但是,编译器总是选择A::f
并忽略::f
。我认为这可能是一个很大的陷阱
我只是想知道:
为什么成员函数的重载解析排除了全局函数?
理由是什么?
作为B类的设计者,我可能不知道B的基类
我不同意
为什么成员函数的重载解析会排除
全球功能
因为这两个重载属于两个不同的作用域,并且编译器选择相同作用域的重载。阅读§3.4.1。内部(相同)作用域的f
隐藏外部的f
理由是什么
有一个坚实的规则。我们更喜欢在同一个范围内工作。除非我们明确地想从其他地方调用对象
在一个打电话给亚历克斯的家庭里,他们希望他们的小儿子亚历克斯进来,而不是警察
作为B类的设计者,我可能不知道B的基类
我不同意
为什么成员函数的重载解析会排除
全球功能
因为这两个重载属于两个不同的作用域,并且编译器选择相同作用域的重载。阅读§3.4.1。内部(相同)作用域的f
隐藏外部的f
理由是什么
有一个坚实的规则。我们更喜欢在同一个范围内工作。除非我们明确地想从其他地方调用对象
在一个打电话给Alex的家庭里,他们希望他们的小儿子Alex进来,而不是那个。这就是超负荷解决的工作原理,这很好
想象一下,你真的有一个大项目,大量的相互依赖关系,第三方代码和跨模块包含。在这片混乱中,你知道有一个类是有效的。它已经完美地工作了5年,它的效率,易于阅读和清洁。你不想碰它。然后升级模块,并开始出现编译器错误。哦,不!该模块(您无法控制)在全局命名空间中引入了一个新函数
doamazingstaff()
。与我们类中的方法名相同。您将不得不重构它,因为现在您不能再为类成员使用相同的名称。真倒霉 过载解析就是这样工作的,这很好
想象一下,你真的有一个大项目,大量的相互依赖关系,第三方代码和跨模块包含。在这片混乱中,你知道有一个类是有效的。它已经完美地工作了5年,它的效率,易于阅读和清洁。你不想碰它。然后升级模块,并开始出现编译器错误。哦,不!该模块(您无法控制)在全局命名空间中引入了一个新函数doamazingstaff()
。与我们类中的方法名相同。您将不得不重构它,因为现在您不能再为类成员使用相同的名称。真倒霉
void f()
{}
struct A
{
void f()
{}
};
struct B : A
{
B()
{
f(); // A::f() is always called, and ::f is always ignored
}
};
int main()
{
B();
}