重载(overload)和覆盖(override)的区别
C#是面向对象的语言,面向对象语言有三大特性:继承、封装和多态。C#支持两种多态,第一编译中多态,通过重载(overload)实现;第二种运行时多态,通过覆盖(override)实现。
重载又分为方法重载和运算符重载。方法重载是指在一个类中,多个方法之间方法名相同,方法的参数类型或个数不同。下面是一个例子。

class Program
{
static void Main(string[] args)
{
Program p = new Program();
Console.WriteLine(p.add(1));
}
int add(int x) //第一个名为add的方法
{
return x;
}
double add(double x) //第二个名为add的方法,但与第一个方法的参数类型不同
{
return x;
}
int add(int x,int y) //第三个名为add的方法,与第一第二个方法的参数个数不同
{
return x+y;
}
}
还有一种重载是运算符重载。即可以重新定义运算符的功能。基本格式为:
public static 返回值类型 operator 运算符(参数)
{
//方法体
}
如下示例,示例中对运算符“++”进行了重载。重载后变成了对Point中的对象各加上10,所以输出结果为“Point.x=20,Point.y=30”。

class Point
{
private int x, y;
public Point(int a,int b)
{
x=a;
y=b;
}
public static Point operator ++(Point p)
{
p.x+=10;
p.y+=10;
return p;
}
static void Main(string[] args)
{
Point a = new Point(10,20);
a++;
Console.WriteLine("Point.x={0},Point.y={1}",a.x,a.y);
}
}
覆盖是通过继承和虚方法来实现的。虚方法是指在方法声明时加上virtual修饰符。覆盖需要方法名、方法参数类型、方法参数个数、返回值类型与基类中的虚方法完全一样。在派生类中重载虚方法要加上override修饰符。

public class Animal
{
public virtual voic Eat()
{
Console.WriteLine(“我要吃”);
}
}
public class Tiger:Animal
{
public override void Eat()
{
Console.WriteLine(“老虎吃动物”);
}
}
public class Test
{
static void Main()
{
Animail an=new Tiger();
an.Eat();
}
}
此示例中输出的结果是“老虎吃动物”。Animal类中定义了一个虚方法Eat(),Tiger类继承Animal的类,其中覆盖了Eat()方法。在Main函数里面an是实例化Tiger类,虚方法是运行时决定的,所以调用的是Tiger类中的Eat()方法。
重载与覆盖之间的主要区别:
1.重载要求方法名相同而方法参数类型或个数不同;覆盖是方法名、参数类型和个数都相同。
2.重载是在同一个类中的不同方法之间;覆盖是子类继承父类,子类方法override父类方法。
3.重载是在编译时决定;覆盖是在运行时决定。
版权公有 欢迎转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库