一.前言
之前在 C# 虚函数virtual的使用 中也讲解过了virtual的用法,它主要用于在有继承关系的类中,给父类设置虚方法,让子类可以去重写该方法。本文再深入了解一下在父类中定义virtual方法,那子类重写该方法的时间点在哪。
二.例子
public class A { public A() { Print(); } public virtual void Print() { } } public class B : A { int x = 1; int y = 0; public B() { y = 1; } public override void Print() { Console.WriteLine("x={0},y={1}", x, y); } } //实例化 B b = new B();
在B类实例化后,会得到什么?
B类是继承了A类,所以在B类实例化的时候,A类和B类的构造函数都会调用,顺序是A类->B类。
在A类构造函数调用时,调用了Print()方法。如果Print()不是virtual方法,那么它的结果是不会输出任何东西。这时候,回顾一下之前说过虚函数的特点,这个函数在编译时是不会被静态编译,它的地址是不确定的,它会在运行期间根据对象来判断要调用的函数。
也就是说,这个virtual函数Print()上,虽然没写,但是它就是包括以下功能,它会不停找它的派生类有无override重写这个方法。
在A类构造函数调用了Print()方法,会找到B类中重写的Print()方法,然后输出x=1,y=0。
b.Print();
再调用Print(),得到的是x=1,y=1。
三.总结
1.虚函数会不停找派生类有无重写该方法,这是在编译过程就已经决定了,和对象实例化这个点没有任何关系。所以,即使在创建实例时先在父类构造函数中调用虚函数,不用等待派生类的构造函数调用,该虚函数也一样会找到其派生类中重写的方法。