C# 方法 虛方法的調用淺談 引用kdalan的博文

來源:互聯網
上載者:User

標籤:style   blog   http   ar   color   os   sp   java   strong   

我們在面試中經常碰到有關多態的問題,之前我也一直被此類問題所困擾,鬧不清到底執行哪個方法。

先給出一道簡單的面試題,大家猜猜看,輸出是?

View Code     public class A
    {
        public void MethodF() 
        { 
            Console.WriteLine("A.F"); 
        }
        public virtual void MethodG() 
        { 
            Console.WriteLine("A.G"); 
        }
    }
    public class B : A
    {
        new public void MethodF() 
        { 
            Console.WriteLine("B.F"); 
        }
        public override void MethodG() 
        { 
            Console.WriteLine("B.G"); 
        }
    }
    class Test
    {
        static void Main()
        {
            B b;
            b = new B();
            A a = b;
            a.MethodF();
            b.MethodF();
            a.MethodG();
            b.MethodG();
        }

首先看一下虛方法的定義(MSDN):

  若一個執行個體方法的聲明中含有 virtual 修飾符,則稱該方法為虛擬方法。若其中沒有 virtual 修飾符,則稱該方法為非虛擬方法。

以上面題目Test類Main中代碼為例,簡單說一下CLR建立對象的過程都做了什麼事情

1) 首先,聲明一個參考型別變數 b,它僅是一個引用,儲存線上程的棧上,用於將來存放B對象的有效地址。此時 b 未指向任何有效執行個體,值為null,相關代碼為:

     B b;

 

2) 接下來,通過new執行對象的建立,即:

     b = new B();對象的執行個體儲存在託管堆上,CLR在建立一個新對象的同時,還會建立它的 類型對象(如果類型對象不存在)。

  對象執行個體在堆中的記憶體包括執行個體欄位、類型對象指標、同步索引塊,類型對象指標指向類型對象。

  類型對象在堆中分配的記憶體包括類型對象指標、同步索引塊、靜態欄位、方法表。

 

3)  A a = b;  這行代碼首先聲明一個類型為A的參考型別變數a,並將其實際地址指向b所指向的對象執行個體。

 

4)  之後就是方法的調用,下面詳細說一下C#中方法的調用:

    a.MethodF();

當調用一個對象的方法時,會直接檢查這個物件變數(a)的類型 ,找到堆中的類型對象,查看是否有該方法,沒有則通過類型對象的類型對象指標向上回溯尋找,直至找到,然後檢查該方法是否為虛方法,如果非虛,直接調用,由於MethodF 方法是非虛的,因此直接調用輸出A.F。

    a.MethodG();

如果該方法為虛方法,即有virtual 關鍵字,則根據物件變數(a),去找到對象的執行個體類B,尋找該類型對象中是否重新實現過該虛方法(override 關鍵字),如果有,OK執行,如果沒有,向上檢查其父類,直至找到然後執行,MethodG為虛方法,則會尋找執行個體B,由於B中重寫了MethodG,因此此處輸出B.G。


  通過上面的描述,開始的那道面試題,我們應該輕鬆可以得出輸出,此處就不囉嗦了。 

 

  一般考多態的面試題中 virtual new override  幾個關鍵字經常出現,new 關鍵字實現一個新的方法,同時隱藏基類的同名方法。 

C# 方法 虛方法的調用淺談 引用kdalan的博文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.