【问题标题】:Overloading and overriding重载和覆盖
【发布时间】:2026-01-17 23:15:01
【问题描述】:

重载和覆盖有什么区别。

【问题讨论】:

  • @james:你至少尝试过谷歌吗??
  • 我猜你不会得到这个。
  • james- 可能不会,我觉得不能解释一个简单的概念很傻
  • @james 我猜你在不知道术语的情况下直觉了这些概念。我猜你是自学成才的。您可能应该拿起一本初学者级别的 C# 书,不是为了学习,而是为了巩固您已经知道的知识。这很让人麻木,但对技术面试有很大帮助。
  • 您可以在此链接上阅读更多内容:intquesans.blogspot.com/2011/05/…

标签: c# inheritance


【解决方案1】:

重载

重载是指在同一范围内有多个方法,名称相同但签名不同。

//Overloading
public class test
{
    public void getStuff(int id)
    {}
    public void getStuff(string name)
    {}
}

覆盖

覆盖是允许您更改子类中方法的功能的原则。

//Overriding
public class test
{
        public virtual void getStuff(int id)
        {
            //Get stuff default location
        }
}

public class test2 : test
{
        public override void getStuff(int id)
        {
            //base.getStuff(id);
            //or - Get stuff new location
        }
}

【讨论】:

  • 我喜欢这个答案@cgreeno ..谢谢
  • @cgreeno 我想你想念void getStuff in test2
  • 只是提到必须将基类方法标记为虚拟才能覆盖,否则会出现编译错误。
  • 嘿,这可能很旧,但我对此仍有疑问。重载是否可以通过“一个”方法获得更多功能?就像我可以这样做:getStuff(2, "Hello world!"); 或者我可以这样做getStuff("Myname", "Mysurname", "Hello World!");?任何人都可以确认这是这样做的方法吗?
  • 我认为覆盖示例实际上是覆盖,覆盖是当您的超类方法意外覆盖或者如果您打算在两种情况下使用 new 关键字覆盖或覆盖,行为是声明 Parent p = new Child(); 时不同p.方法(); ...也许我错了,这只是做几乎同样事情的另一种方式。谁能比我解释清楚?
【解决方案2】:

重载和覆盖的简单定义

重载(编译时多态)::同名不同参数的函数

public class A
{
    public void print(int x, int y)
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public void print(float x, float y)
    {
        Console.WriteLine("Overload child method");
    }
}

重写(运行时多态性)::扩展类中的函数与基类中的名称和参数相同,但行为不同。

public class A
{
    public virtual void print()
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public override void print()
    {
        Console.WriteLine("Overriding child method");
    }
}

【讨论】:

  • 也许您想补充一点,覆盖概念适用于父类-子类关系。
【解决方案3】:

我想分享一个在我学习时对我很有意义的例子:

这只是一个例子,不包括虚方法或基类。只是为了给出关于主要思想的提示。

假设有一台洗车机,它有一个名为“Wash”的功能并接受 Car 作为一种类型。

获取 Car 输入并清洗 Car。

public void Wash(Car anyCar){
       //wash the car
}

让我们重载 Wash() 函数

重载:

public void Wash(Truck anyTruck){
   //wash the Truck  
}

Wash 功能以前只能洗车,现在超载也可以洗卡车了。

  • 如果提供的输入对象是 Car,它将执行 Wash(Car anyCar)
  • 如果提供的输入对象是卡车,那么它将执行 洗(卡车任何卡车)

让我们重写 Wash() 函数

覆盖:

public override void Wash(Car anyCar){
   //check if the car has already cleaned
   if(anyCar.Clean){ 
       //wax the car
   }
   else{
       //wash the car
       //dry the car
       //wax the car
   }     
}

清洗功能现在有一个条件来检查汽车是否已经干净并且不需要再次清洗。

  • 如果汽车是干净的,则只需打蜡即可。

  • 如果不干净,那就先洗车,再擦干再打蜡 它

因此,该功能已通过添加新功能或执行完全不同的操作而被覆盖。

【讨论】:

  • 这一定是答案。投票+
【解决方案4】:
  • 重载 = 多个方法签名,相同的方法名称
  • 覆盖 = 相同的方法签名(声明为虚拟),在子类中实现

精明的面试官会跟进:

What's the difference between overriding and shadowing?

【讨论】:

  • 从来不知道它被称为阴影,很高兴知道。唯一的关系重载和覆盖是 overing。
【解决方案5】:

正如迈克尔所说:

  • 重载 = 多个方法签名,相同的方法名称
  • 覆盖 = 相同的方法签名(声明为虚拟),在子类中实现

  • Shadowing = 如果作为 DerivedClass 使用派生方法,如果作为 BaseClass 使用基本方法。

【讨论】:

    【解决方案6】:

    拥有多个同名但参数不同的方法/构造函数称为重载。这是一个编译时事件。

    Class Addition 
    {
       int add(int a, int b) 
       {
         return a+b;
       }
       int add(int a, int b, int c)
       {
         return a+b+c;
       }
    
       public static main (String[] args) 
       {
         Addition addNum = new Addition();
         System.out.println(addNum.add(1,2));
         System.out.println(addNum.add(1,2,3));
       }
    }
    

    O/p:

    3
    6
    

    覆盖是一个运行时事件,这意味着根据您的代码,输出在运行时会发生变化。

    class Car
    {
        public int topSpeed() 
        {
            return 200;
        }
    }
    class Ferrari extends Car
    {
        public int topSpeed()
        {
            return 400;
        }
        public static void main(String args[])
        {
            Car car = new Ferrari();
            int num= car.topSpeed();
            System.out.println("Top speed for this car is: "+num);
        }
    }
    

    请注意,两个类 topSpeed() 中有一个通用方法。 由于我们实例化了一辆法拉利,我们得到了不同的结果。

    O/p:

    Top speed for this car is: 400
    

    【讨论】:

      【解决方案7】:

      在 C# 中没有像 Java 那样的 hidden 覆盖,在覆盖方法上没有关键字 override!查看这些 C# 实现:

      没有 override 的变体 1:结果为 200

          class Car {
              public int topSpeed() {
                  return 200;
              }
          }
      
          class Ferrari : Car {
              public int topSpeed(){
                      return 400;
              }
          }
      
          static void Main(string[] args){
              Car car = new Ferrari();
              int num= car.topSpeed();
              Console.WriteLine("Top speed for this car is: "+num);
              Console.ReadLine();
          }
      

      带有 override 关键字的变体 2:结果为 400

          class Car {
              public virtual int topSpeed() {
                  return 200;
              }
          }
      
          class Ferrari : Car {
              public override int topSpeed(){
                      return 400;
              }
          }
      
          static void Main(string[] args){
              Car car = new Ferrari();
              int num= car.topSpeed();
              Console.WriteLine("Top speed for this car is: "+num);
              Console.ReadLine();
          }
      

      关键字 virtual 在 Car 类上与 Java 上的 final 相反,表示 不是 final,如果 Car 是抽象的,您可以覆盖或实现

      【讨论】:

        【解决方案8】:

        shadowing = 在派生类中维护两个定义,为了投影基类定义,它隐藏(隐藏)派生类定义,反之亦然。

        【讨论】:

          【解决方案9】:

          还有一点要补充。

          重载 多个同名方法。相同或不同的返回类型。不同的参数或不同类型的参数。在同一类或派生类中。

          int Add(int num1, int num2) 整数加(整数 1,整数 2,整数 3) 双加(int num1,int num2) 双加(双数1,双数2)

          可以在同一个类或派生类中。 一般喜欢同班。例如。 Console.WriteLine() 有 19 个重载方法。

          可以重载类的构造函数、方法。

          可以认为是编译时(静态/早期绑定)多态性。

          ================================================ ==================================================== ====

          覆盖不能在同一个类中。 可以覆盖类方法、属性、索引器、事件。

          有一些限制,例如 被覆盖的基方法必须是虚拟的、抽象的或覆盖的。 您不能使用 new、static 或 virtual 修饰符来修改覆盖方法。

          可以认为是运行时(动态/后期绑定)多态性。

          帮助进行版本控制http://msdn.microsoft.com/en-us/library/6fawty39.aspx

          ================================================ ==================================================== ====

          有用的链接

          http://msdn.microsoft.com/en-us/library/ms173152.aspx Compile time polymorphism vs. run time polymorphism

          【讨论】:

          • 不错,包含所需的详细信息。
          【解决方案10】:

          重载是静态多态的一部分,用于实现同名但不同签名的不同方法。 Overriding 用于补全不完整的方法。在我看来,这两个概念之间没有可比性,唯一相似的是两者都带有相同的词汇。

          【讨论】:

          • 这里的队长:重载一个方法会给你多个同名的不同方法的签名。覆盖从类或接口中隐藏继承的成员。 飞走了
          • @SparK 覆盖不会隐藏成员。您可以要么覆盖隐藏继承的成员。这两者是互斥的选项。
          • @Servy,用词错误,我的意思是“替代品”。
          【解决方案11】:

          重载是一个概念,你有相同的签名或具有相同名称但不同参数的方法和覆盖,我们有不同参数的同名方法也有继承称为覆盖。

          【讨论】:

            【解决方案12】:

            方法重载和方法覆盖是两个完全不同的概念。方法重载具有相同的方法名称但具有不同的签名。方法覆盖是改变派生类中基类方法的默认实现。您可以在下面找到 2 个解释这些概念的优秀视频教程。

            Method overriding Vs hiding

            Method overloading

            【讨论】: