关于Virtual

来源:互联网 发布:anaconda linux 下载 编辑:程序博客网 时间:2024/06/05 17:11

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication13
{
    class Program
    {
        class Number
        {
            public static int i = 123;
            public virtual void ShowInfo()
            {
                Console.WriteLine("base class-----");
            }
            public virtual void ShowNumber()
            {
                Console.WriteLine(i.ToString());
            }
        }
        class IntNumber:Number
        {
            new public static int i=456;//对静态字段也声明为new?
            public new virtual void ShowInfo()
            {
                Console.WriteLine("Derived class----");
            }
            public override void ShowNumber()
            {
                Console.WriteLine("base number is {0}",Number.i.ToString());//调用的是父类的静态字段
                Console.WriteLine("new number is {0}",i.ToString());  //调用的是当前的静态字段
            }


        }
        static void Main(string[] args)
        {
            //Number num = new Number();
            //num.ShowNumber();//调用父类的静态字段  123
            //IntNumber intnum = new IntNumber();
            //intnum.ShowNumber();//调用子类对父类的重载方法,会显示子类的方法  123  456
            //intnum.ShowInfo();


            Number number = new IntNumber();
            number.ShowInfo();//
            number.ShowNumber();
        }
    }
}


什么是隐藏,我老是不懂,现在懂了。

在子类new一个对象的时候,如本例的intNumber ,它里面的 

  public new virtual void ShowInfo()
            {
                Console.WriteLine("Derived class----");
            }


这个方法,如图所示,会在子类中,新生成一个方法对象 ,而原来的  

 public new virtual void ShowInfo()
            {
                Console.WriteLine("base   class----");
            }

会被隐藏,这里的隐藏,不是覆盖,子类并没有对父类的ShowInfo方法,进行修改,

只不过是,子类对外显示的时候,貌似只看到子类的showinfo()方法,

当我们的引用类型是子类的时候,方法指针指向 子类中的方法

当引用类型是父类的时候,方法指针指向父类中的方法,所以就会显示父类的方法了。


对于,覆盖和隐藏,最关键的是,把握好,在内存的分配情况

原创粉丝点击