首页 > 代码库 > 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#对私有成员的继承
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。