与在C ++中重写相混淆

时间:2018-04-01 18:41:32

标签: c++ overloading

所以我在一次采访中遇到了这个问题并对重载规则感到非常困惑,你能否指点我在​​编译时的解释。

重载功能:

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;

这些功能之间的选择有哪些规则?

1 个答案:

答案 0 :(得分:3)

您在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)函数一样含糊不清。