关于C++中的函数覆盖,以下是合法的,因为这两种原型都有不同数量的参数:
void func(int par1, double par2);
void func(int par1, double par2, double par3);如上(因为至少有一个不同类型的参数):
void func(int par1, double par2);
void func(double par1, double par2);我想知道,奇怪的是,是否可以重载相同类型的相同数量的参数,但顺序不同?例如,是合法的:
void func(int par1, double par2);
void func(double par1, int par2);如果是这样的话,是否有任何正式的文档指定它?
发布于 2014-09-15 03:14:16
正式文件是国际标准化组织的C++标准,是的,你可以这样做。
ISO C++11第13章的全部内容都是关于重载的,但前几段很好地总结了这一点:
当为同一作用域中的单个名称指定两个或多个不同的声明时,该名称被称为重载。通过扩展,在相同范围内声明相同名称但具有不同类型的两个声明称为重载声明。只能重载函数和函数模板声明;不能重载变量和类型声明。 当调用中使用重载函数名时,将通过比较使用点的参数类型和在使用点可见的重载声明中的参数类型来确定所引用的重载函数声明。
如果参数列表不同,包括顺序,重载是可能的。你在问题中提出的三种情况都是不同的:
{int, double} vs {int, double, double}
{int, double} vs {double, double}
{int, double} vs {double, int}请注意,这两个函数不可能重载:
void func(int par1, int par2);
void func(int par2, int par1);因为它实际上只是提供唯一性的类型,而不是参数名称。这两个函数都称为func,它们都有参数列表{int, int},因此它们并不是唯一的。
发布于 2014-09-15 03:28:42
允许具有相同参数数和相同类型,但参数顺序不同的重载函数:
void func(int a, double b) {
}
void func(double a, int b) {
}当我们列出输出的符号时,我们得到
000000000000025d T _Z4funcdi
000000000000024f T _Z4funcid这意味着编译器在不同的地址上导出两个不同的函数。第一个是_Z4funcdi,d表示双,我表示int。
发布于 2014-09-15 03:18:03
可以用相同类型的相同数量的参数过载,但顺序不同吗?
如果你想一想-没有真正的理由不合法。编译器不关心函数参数代表什么,也没有那么聪明。从这个角度看,这两个定义是不同的,因为它们采用不同的参数。
在这种情况下,唯一需要处理的事情是调用函数。例如,如果您有一个同时定义了operator double 和 operator int的类,那么如果您尝试这样做,编译器将抛出一个错误:
myClassWithBothCastOperators a, b;
func(a,b); //<-- ERROR!但是,即使在这种情况下,仍然可以通过显式转换对象来调用函数:
myClassWithBothCastOperators a, b;
func((int)a, (double)b); //All fine here!不过,我不认为这是一个好的设计模式,对于阅读和使用您的代码的人来说,选择一个propper版本会更加清晰。这里作为一个真实的例子,请看一下PHP的implode。在C++中,您可以看到变量的类型,而在PHP中,变量可以容纳几乎任何类型,当implode/explode与没有非常有意义的名称的变量一起使用时,分析/调试代码就变成了一场噩梦。
https://stackoverflow.com/questions/25840328
复制相似问题