“重载”/“过载”对于编程意味着什么?
答案 0 :(得分:22)
这意味着您提供的函数(方法或运算符)具有相同的名称,但具有不同的签名。 例如:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
答案 1 :(得分:15)
基本概念
重载或“方法重载”是具有多个具有相同名称但具有不同参数的方法的概念的名称。
例如c#中的System.DateTime类有多个ToString方法。标准ToString使用系统的默认文化将datetime转换为string:
new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America
同一方法的另一个重载允许用户自定义格式:
new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"
有时参数名称可能相同,但参数类型可能不同:
Convert.ToInt32(123m);
在
时将小数转换为intConvert.ToInt32("123");
将字符串转换为int。
重载决议
为了找到要调用的最佳重载,编译器执行名为“重载决策”的操作。对于第一个示例,编译器只需匹配参数计数即可找到最佳方法。对于第二个示例,如果传递十进制参数,编译器会自动调用replace方法的十进制版本,如果传递字符串参数,则调用字符串版本。从可能的输出列表中,如果编译器找不到合适的输出,您将得到编译器错误,如“最佳过载与参数不匹配......”。
您可以find获取有关不同编译器如何执行重载解析的大量信息。
答案 2 :(得分:6)
当一个函数有多个签名时,它会被重载。这意味着您可以使用不同的参数类型调用它。例如,您可能具有在屏幕上打印变量的功能,您可以为不同的参数类型定义它:
void print(int i);
void print(char i);
void print(UserDefinedType t);
在这种情况下,函数print()将有三个重载。
答案 3 :(得分:4)
这意味着具有相同功能的不同版本,它们采用不同类型的参数。这样的功能是“过载的”。例如,采用以下功能:
void Print(std::string str) {
std::cout << str << endl;
}
您可以使用此功能将字符串打印到屏幕上。但是,当您想要打印整数时,不能使用此功能,您可以再创建该函数的第二个版本,如下所示:
void Print(int i) {
std::cout << i << endl;
}
现在函数被重载了,函数的哪个版本将取决于你给出的参数。
答案 4 :(得分:2)
其他人已经回答了过载的原因。当你开始时,它会被覆盖/覆盖混淆。
与重载相反,重写是在子类(或子类)中定义具有相同签名的方法,该方法将覆盖父类实现。某些语言需要显式指令,例如C ++中的virtual
成员函数或Delphi和C#中的override
。
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
答案 5 :(得分:1)
重载方法是指具有多个参数数量和类型选项的方法。例如:
foo(foo)
foo(foo, bar)
两者都会做相对相同的事情,但其中一个有更多选项的第二个参数
您也可以采用相同的方法采用不同的类型
int Convert(int i)
int Convert(double i)
int Convert(float i)
答案 6 :(得分:0)
就像在常见用法中一样,它指的是某些东西(在这种情况下,是一个方法名称),不止一个工作。
答案 7 :(得分:0)
重载是穷人的multimethods from CLOS and other languages版本。这是令人困惑的。
覆盖是通常的OO。它与继承有关,我们称之为重新定义(例如在https://stackoverflow.com/users/3827/eed3si9n's answer Line
中提供了Draw()
的专门定义。