码迷,mamicode.com
首页 > Windows程序 > 详细

C#对私有成员的继承

时间:2015-01-05 18:38:29      阅读:1136      评论:0      收藏:0      [点我收藏+]

标签:

今天工作不是很忙,使得有些空闲时间,看了下以前的学习笔记,又看到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#对私有成员的继承

标签:

原文地址:http://www.cnblogs.com/ydp1991/p/4204212.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!