与在C 中覆盖的人混淆了

got confused with overriding in C++

本文关键字:覆盖 与在      更新时间:2023-10-16

所以我在面试中面对这个问题,对超负荷规则感到非常困惑,您能指出我在编译时的阐述。

超载功能:

int mult(int a, int b)
{
    cout<<"int "; return a*b;
}
long mult(long a, long b)
{
    cout<<"long "; return a*b;
}
float mult(float a, float b)
{
    cout<<"float "; return a*b;
}

然后呼叫:

long m = mult(5.2,7);
cout<<"result "<<m<<endl;
float f = mult(5,7.2);
cout<<"result "<<f<<endl;

功能之间选择的规则是什么?

您在https://en.cppreference.com/w/cpp/language/overload_resolution

上有很好的描述。

这里发生的事情是,根据最少的转换量选择了多数。

long m = mult(5.2,7);

long m完全无关。此调用是mult(double, int),因此为了找到适合此功能的最佳拟合,规则说的是使用最少的转换量找到该功能。(请参阅最佳可行函数(。

这只需mult(int, int)即可进行一次转换。所有其他功能都需要两个隐式转换才能匹配。

第二个呼叫也是相同的参数。

这些规则很容易使呼叫模棱两可,例如

如果您添加

float mult(int a, float b);

进入混音,您的程序不会编译。呼叫

float f = mult(5, 7.2);

也是一个隐式转换,与 mult(int, int)函数相同。

相关文章: