关于编程,“过载”/“过载”是什么意思?
8 回答
这意味着您提供了一个名称相同但签名不同的函数(方法或运算符)。例如:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
基本概念
重载或“方法重载”是具有多个具有相同名称但具有不同参数的方法的概念的名称。
例如,c# 中的 System.DateTime 类有多个 ToString 方法。标准 ToString 使用系统的默认区域性将日期时间转换为字符串:
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);
将小数转换为 int 而
Convert.ToInt32("123");
将字符串转换为 int。
过载分辨率
为了找到要调用的最佳重载,编译器执行名为“重载解析”的操作。对于第一个示例,编译器只需匹配参数计数即可找到最佳方法。对于第二个示例,如果传递十进制参数,编译器会自动调用十进制版本的替换方法,如果传递字符串参数,编译器会自动调用字符串版本。从可能的输出列表中,如果编译器找不到合适的调用,您将收到类似“最佳重载与参数不匹配...”的编译器错误。
您可以找到很多关于不同编译器如何执行重载解析的信息。
当一个函数有多个签名时,它就会被重载。这意味着您可以使用不同的参数类型调用它。例如,您可能有一个在屏幕上打印变量的函数,您可以为不同的参数类型定义它:
void print(int i);
void print(char i);
void print(UserDefinedType t);
在这种情况下,函数 print() 将具有三个重载。
这意味着具有相同函数的不同版本,它们采用不同类型的参数。这样的功能是“重载”的。例如,采用以下函数:
void Print(std::string str) {
std::cout << str << endl;
}
您可以使用此函数将字符串打印到屏幕上。但是,当您要打印整数时不能使用此函数,您可以制作该函数的第二个版本,如下所示:
void Print(int i) {
std::cout << i << endl;
}
现在函数被重载了,调用哪个版本的函数取决于你给它的参数。
其他人已经回答了超载是什么。当您开始时,它会与覆盖/覆盖混淆。
与重载相反,覆盖是在子类(或子类)中定义具有相同签名的方法,它会覆盖父类的实现。某些语言需要显式指令,例如virtual
C++ 或override
Delphi 和 C# 中的成员函数。
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.");
}
}
重载方法是一种具有多个参数数量和类型选项的方法。例如:
foo(foo)
foo(foo, bar)
两者都会做相对相同的事情,但一个有更多选项的第二个参数
您也可以使用相同的方法采用不同的类型
int Convert(int i)
int Convert(double i)
int Convert(float i)
就像通常的用法一样,它指的是某事(在这种情况下,是方法名称),做不止一项工作。
重载是来自 CLOS 和其他语言的多方法的穷人版本 。这是令人困惑的一个。
覆盖是通常的 OO 之一。它与继承有关,我们也将其称为重新定义(例如,在https://stackoverflow.com/users/3827/eed3si9n 的答案 Line
中提供了Draw()
.