1. 虚函数的特点
虚函数是面向对象语言中多态性的重要实现. 当一个函数方法在声明时, 前面带了virtual关键字, 这个函数就是一个虚函数. 它与非虚函数的主要区别在于它的实现可以在派生类中进行重写(override)(非强制要求). 重写后的函数一样也是虚函数, 当一个类或其基类中存在虚函数后就不允许出现同名, 返回值, 参数类型个数相同的非虚函数.
虚函数由于可以被子类改写的特点, 不允许设为私有(private), 同时也不能和static, override, abstract等一起使用.除了函数方法外, C#中还可以用virtual修饰属性, 索引器, 事件等等.
2. 虚函数的执行过程
当调用一个对象的一个函数时, 系统会首先去检查该对象的声明类中这个函数是不是虚函数, 如果不是虚函数就直接执行函数. 如果是虚函数的话再去检查这个对象的实例类, 看看实例类中有没有重写这个虚函数, 如果有的话就直接执行该函数, 否则就去找这个实例类的父类, 看看他的父类中有没有重写这个虚函数,有的话就执行, 没有的话就继续找直到找遍所有父类, 如果没有override关键字, 最后会执行申明类里的虚函数.
代码来了!
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class start
{
public void main()
{
GoodClass gc = new GoodClass();
gc.GoodFunc();
GoodClass nc = new NiceClass();
nc.GoodFunc();
}
}
This is a good function!!!
This is a nice function
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class GreatClass : NiceClass{}
public class start
{
public void main()
{
GoodClass gc = new GreatClass();
gc.GoodFunc();
}
}
This is a nice function