2012-12-27 60 views

回答

0

因爲你創建一個類的實例,它指的是B類

A ob = new B(); 

的地址,因爲實例是A類的,你調用的方法指向方法在A類中。 您可以通過進行調試並執行代碼來檢查此問題。

代替如果創建B類即實例

B ob = new B(); 

它將從B類調用方法趣()和將顯示輸出作爲 「B級:12」

+0

OB僅僅是基類的引用,其實際持有B類的實例,這是動態調度的概念。 –

2

的默認參數爲在編譯時填充,代碼通過基類引用變量ob。如預期的那樣,虛擬方法覆蓋在運行時工作。您可以通過使用方法超載達到預期的效果:

class A 
{ 
    public void Func(int value) 
    { 

    } 

    public virtual void Func() 
    { 
     Func(4); 
    } 
} 

class B: A 
{ 
    public override void Func() 
    { 
     Func(12); 
    } 
} 
+0

感謝@alex。概念清除。 –

0

默認參數值是靜態綁定。

+0

這應該是一個評論可能? – horgh

1

編譯器根據對象類型放置默認參數值,並在編譯期間完成。
因此,編譯後的代碼看起來像:

using System; 
namespace Apple 
{ 
    public class Program 
    { 
     private static void Main(string[] args) 
     { 
      A ob = new B(); 
      ob.Func(4); 
      Console.ReadLine(); 
     } 
    } 
} 


你可以得到由這樣期望的結果:

public class Program 
    { 
     static void Main(string[] args) 
     { 
      A ob = new B(); 
      ((B)ob).Func(); 
      Console.ReadLine(); 
     } 
    } 
相關問題