C# 虚函数virtual的使用之二

一.前言

  之前在 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.虚函数会不停找派生类有无重写该方法,这是在编译过程就已经决定了,和对象实例化这个点没有任何关系。所以,即使在创建实例时先在父类构造函数中调用虚函数,不用等待派生类的构造函数调用,该虚函数也一样会找到其派生类中重写的方法。

  

 

 

 

 

  

 

posted @ 2021-04-12 09:44  shine声  阅读(137)  评论(0编辑  收藏  举报