C#對私人成員的繼承

來源:互聯網
上載者:User

標籤:

今天工作不是很忙,使得有些空閑時間,看了下以前的學習筆記,又看到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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.