关于Virtual

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()方法,

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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值