C#中重载重写和覆盖的定义与区别

2020-01-05 09:53:50王旭

如:


 class Program 
  { 
    static void Main(string[] args) 
    { 
      oc oa=new ob(); 
      oa.b(1, 2);  //输出结果为fdfdf 
    } 
    public class oc 
    { 
      private int a; 
     //封装 
      public int geta 
      { 
        get { return a; } 
      } 
      public int seta 
      { 
        set { a = value; } 
      } 
     //函数b 
      public virtual int b(int c, int e) 
      { 
        Console.WriteLine("{0}+{1}={2}", c, e, c + e); 
        return c + e; 
      } 
    } 
    //派生类ob,基类oc 
    public class ob : oc 
    { 
    //重写基类中的函数b 
      public override int b(int c,int e) 
      { 
        Console.WriteLine("fdfdf"); 
        return c; 
      }  
    } 
}

三、覆盖

   1、示意

    覆盖指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。

   2、发生条件

   在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字。

如:


 class Program 
  { 
    static void Main(string[] args) 
    { 
      oc oa=new ob(); 
      oa.b(1, 2); //输出结果为1+2=3 
    } 
    public class oc 
    { 
      private int a; 
    //封装 
      public int geta 
      { 
        get { return a; } 
      } 
      public int seta 
      { 
        set { a = value; } 
      } 
    //函数b 
      public int b(int c, int e) 
      { 
        Console.WriteLine("{0}+{1}={2}", c, e, c + e); 
        return c + e; 
      } 
    } 
  //派生类ob,基类oc 
    public class ob : oc 
    { 
     //覆盖,隐藏基类中的函数b 
      public new int b(int c,int e) 
      { 
        Console.WriteLine("fdfdf"); 
        return c; 
      }  
    } 
}