- 把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
- 在派生类中重写另外一个函数时,要使用override关键字显示声明
- 我们在子类里面重写虚函数之后,不管在哪里调用都是调用重写之后的方法
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
}
}