首页 > 代码库 > C#对私有成员的继承

C#对私有成员的继承

今天工作不是很忙,使得有些空闲时间,看了下以前的学习笔记,又看到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的地址,看一下整个输出过程是不是同一个对象:

技术分享

C#对私有成员的继承