方法重载
21. 辨别方法重载
在调用重载方法时,编译器会根据方法的参数个数、参数类型和方法属性(const 方法),来区分不同的方法,这 3 项也被称为方法的签名。这里需要注意的是方法的签名不包含方法的返回值,也就是说方法返回值类型不作为区分重载方法的标记。
22. 方法重载的歧义现象
下面代码有何错误?
class CCalc
{
public:
intAdd(int one, int two) //重载 Add 方法
{
cout<<"第一个版本的 Add 被调用" << endl;
return one + two;
}
intAdd(int one, int two)const //重载 Add 方法
{
cout<<"第二个版本的 Add 被调用" << endl;
return one + two;
}
doubleAdd(int one, int two) //重载 Add 方法
{
cout<<"第三个版本的 Add 被调用" << endl;
return one + two;
}
};
int main(int argc, char* argv[])
{
CCalc calc;
calc.Add(10, 15); //调用重载方法
return 0;
}
本题中实现了 3 个重载版本的 Add 方法。表面上看来第一个重载方法和第二个方法原型很相似,问题可能出在这里。其实不然,这是出题人设计的一个陷阱。问题出现在第一个重载方法和第三个重载方法,它们的区别是方法的返回值类型不同。在进行方法重载时以参数个数、参数类型和方法属性(const 方法)来区分不同的方法,而不以返回值来区分。
第三个重载版本的 Add 函数出现错误。它与第一版本的 Add 函数会出现歧义。在执 calc.Add(10, 15);
语句时编译器无法区分调用第一个还是第三个版本的 Add 函数。
网友评论