C++ 与C+中的重写混淆+;

C++ 与C+中的重写混淆+;,c++,overloading,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;

所以我在一次采访中遇到了这个问题,对重载规则感到非常困惑,你能在编译时给我指一下解释吗

重载函数:

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;
}
intmult(inta,intb)
{

你能很好地描述一下你的工作吗

这里发生的事情是,mult是基于最少的转换量选择的

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)
函数相同,因此不明确。

它似乎是重载的,而不是重写的。函数由函数签名唯一确定。参数类型是函数签名的一部分,以及函数名和某些关键字(例如const)。请注意,返回类型不是签名的一部分,因为运行时类型转换。对,它是重载的,我总是混合使用这两个术语…@Will Gu,那么在我的情况下,选择一个或另一个函数签名的规则是什么?我想说函数是由输入类型选择的,因此是第三个。但这是错误的。我意识到有些东西有趣的是:关于double vs float的有趣事实……但在我的例子中,它甚至更难,因为我们有一个没有小数的数字(可以是整数或长的)和一个带小数的数字(在我们的例子中是double)…所以这里调用的函数似乎是同时具有int参数的函数…我仍然找不到该规则的正确定义。
float f = mult(5, 7.2);