C#虚方法 Virtual 详解
一般函数: 在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间不发生
变化,也就是写死了的!
虚函数: 在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期
对象实例来动态判断要调用的函数,其中那个声明时定义的类叫申明类,那个执行时实例
化的类叫实例类。
eg。 飞禽 bird = new 麻雀();
飞禽就是申明类,麻雀是实例类。
具体的检查流程过程如下:
1. 当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看
所调用的函数是否为虚函数;
2. 如果不是虚函数,那么他将直接执行该函数。而如果有 virtual 关键字,也就是一个虚
函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。
3. 在这个实例类里,它会检查这个实例类的定义中是否有重新实现该虚函数(通过
override 关键字),如果是有,那么就不会再继续找了,而马上执行该实例类中的这个
重新实现的函数。而如果没有的话,系统就会不停的往上找实例类的父类,并对父类
重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行
该父类里重载后的函数。
Eg.
Using System;
Namespace Zhisi.net
{
Class A
{
Public virtual Void Func() // 注意,virtual 表明是一个虚拟函数;
{
Console.WriteLine(“Func In A”);
}
Class B:A //B 从 A 类继承,所以 A 是父类,B 是子类;
{
Public override void Func()
{
Console.WriteLine(“Func In B”);
}
}
Class C:B //C 是从 A 类继承,所以 B 是父类,C 是子类;
{
}
Class D:A //注意 B 是从 A 类继承,所以 A 是父类,D 是子类;
{
Public new void Func() //注意 new,表明覆盖父类里的同名类,而不是重新实现;
{
Console.writeline(“Func In D”);