标签:
今天工作不是很忙,使得有些空闲时间,看了下以前的学习笔记,又看到C#继承这一块的内容,虽然早就知道C#中的继承是可以继承私有成员的,但却一直没有深入剖析其中的原理,今天就深入的研究了一下。
首先采用反射的方式来获取,但是一点结果都没有,然后查了一些资料,了解到VMT(虚拟方法表)的概念,这里也不做陈述,改装了一个别人的例子来查看:
using System; class Base { private int flag = 1; public int GetNum(Child c) { return c.flag; } public int GetNum(Base b) { return b.flag; } public Base() { } public Base(int flag) { this.flag = flag; } } class Child : Base { private int flag = 2; public new int GetNum(Child c) { return c.flag; } public Child(int flag) : base(flag) { this.flag = 3; } } class test { public static void Main() { Base b = new Base(); Child c = new Child(4); Console.WriteLine(b.GetNum(c)); Console.WriteLine(c.GetNum(c)); Console.WriteLine(b.GetNum((Base)c)); } }
这里的运行结果是4,3,4.
为什么会是这样呢,可以分析一下:
Main函数中
Base b = new Base();
Child c = new Child(4);
这两句话执行后 b,c的内存结构不做陈述了,
Console.WriteLine(b.GetNum(c));
执行时会调用Base类的GetNum(Child c)的重载,此时Base类不能获取到Chlid的私有变量,所以输出Child在父类中继承的flag值为4(构造函数中base(flag)改为4的),此时已经可以证明私有字段被子类继承了。
执行
Console.WriteLine(c.GetNum(c));
得到结果3,这里的就需要不分析了
执行
Console.WriteLine(b.GetNum((Base)c));
得到4也充分证明了私有字段被子类继承了。
这里也可以监视一下c的地址,看一下整个输出过程是不是同一个对象:
标签:
原文地址:http://www.cnblogs.com/ydp1991/p/4204212.html