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

      

      

  • 相关阅读:
    ALV 填值返回更新屏幕
    alv 的几种形式 和 函数
    JS 截取字符串的空格
    codeigniter 轻量级架构知识初习
    之前的博客挂掉了
    在服务器上运行php文件来执行操作
    浏览器判断
    php 汉字判断
    web 套打方法实现打印机功能
    WIN8
  • 原文地址:https://www.cnblogs.com/shadoll/p/14591113.html
Copyright © 2011-2022 走看看