c#虚方法

  1. 把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
  2. 在派生类中重写另外一个函数时,要使用override关键字显示声明
  3. 我们在子类里面重写虚函数之后,不管在哪里调用都是调用重写之后的方法
    class Enemy
    {
        public virtual  void Move()
        {
            Console.WriteLine("这是调用的Enemy.Move()");
        }
        public void AI()
        {
            Move();
            Console.WriteLine("这是调用的Enemy.AI()");
        }
    }
    class Boss:Enemy
    {
        public override void Move()
        {
            Console.WriteLine("这是调用的Boss.Move()");
        }    
        public void A()
        {
            Move();
            Console.WriteLine("这是调用的Boss.A()");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Boss boss1 = new Boss();
            boss1.AI();//这是调用的Boss.Move();这是调用的Enemy.AI()
            boss1.Move();//这是调用的Boss.Move()
            boss1.A();//这是调用的Boss.Move();这是调用的Boss.A()

            Console.WriteLine("----------------");

            Enemy enemy = new Enemy();
            enemy.AI();//这是调用的Enemy.Move();这是调用的Enemy.AI()
            enemy.Move();//这是调用的Enemy.Move()

            Console.WriteLine("----------------");

            Enemy boss2 = new Boss();
            boss2.Move();//这是调用的Boss.Move()。如果没有Override(即隐藏函数),则会调用Enemy.Move()

            Console.ReadKey();
        }
    }

经典例题(虚方法和隐藏函数之间的区别):

下列代码输出为:

class Father{
   public void F() { Console.WriteLine("A.F"); }
   public virtual void G() { Console.WriteLine("A.G"); }
}
class Son: Father{
   new public void F() { Console.WriteLine("B.F"); }//隐藏了父类中的方法,父类中的F方法还存在
   public override void G() { Console.WriteLine("B.G"); }//重写了父类中的方法,父类中的G方法就不存在了
}
class override_new{
   static void Main() {
      Son b = new Son();
      Father a = b;
      a.F();//通过父类声明的对象 调用隐藏方法,会调用父类中的  A.F
      b.F();//通过子类声明的对象 调用隐藏方法,会调用子类中的  B.F
      a.G();// B.G
      b.G();//B.G
   }
}

猜你喜欢

转载自blog.csdn.net/qq_40323256/article/details/82975525