C#中abstract与virtual的用法
关于C#中的abstract与virtual的用法一直迷糊。于是自己动手写一写试试。
1.第一种情况
//抽象动物类,声明抽象方法Shout(),注意抽象方法没有方法体
abstract class Animal
{
public abstract void Shout();
}// 猫类,继承动物类,覆盖抽象Shout()方法
class Cat:Animal
{
public Cat()
{
}
public override void Shout()
{
Console.WriteLine("喵喵!");
}
}// 狗类,继承动物类,覆盖抽象Shout()方法
class Dog:Animal
{
public Dog()
{
}
public override void Shout()
{
Console.WriteLine("汪汪!");
}
}// 客户程序调用
static void Main(string[] args)
{
Animal cat = new Cat();
cat.Shout();
Animal dog = new Dog();
dog.Shout();
Console.ReadKey();
}
运行结果如下:
2.第二种情况
如果用virtual,Animal类则修改如下,注意虚方法要有方法体。
abstract class Animal
{
public virtual void Shout()
{
Console.WriteLine("动物叫!");
}
}
运行结果依旧:
在第一种情况下,由于子类必须要实现基类的抽象方法,所以如果把Cat类的Shout()方法去掉,程序编译会报错。
但是在第二种情况下,如果把Cat类的Shout()方法去掉,则客户端没有覆盖基类的Shout()方法,cat.Shout()会调用基类的Shou()方法。运行结果如下:

浙公网安备 33010602011771号