日期:2014-05-19  浏览次数:20745 次

分析一个小DEMO
程序:
public   class   A    
{  
                public   virtual   void   Fun1(int   i)  
              {  
                        Console.WriteLine(i);  
                }  

                public   void   Fun2(A   a)      
              {  
                        a.Fun1(1);  
                        Fun1(5);  
                }  
}  


public   class   B   :   A    
{  
                public   override   void   Fun1(int   i)        
              {  
                        base.Fun1   (i   +   1);  
                }  

                public   static   void   Main()      
              {  
                        B   b   =   new   B();  
                        A   a   =   new   A();  
                        b.Fun2(a);                    
                }  
}  

这个输出结果是1   和6
我不明白为什么,以我看该是输出2和6,请详细解说下


------解决方案--------------------
B b = new B(); 创建实例。
A a = new A(); 创建实例。
b.Fun2(a); 调用b的Fun2 ,b自己没Fun2,进入基类a的Fun2

public void Fun2(A a)
{
a.Fun1(1); //实例a的Fun1(1)当然输出个 1。
Fun1(5); //这里由于是b的实例调用进来的,所以进入b的overide的Fun1 ,然后base.Fun1 (i + 1),调用基类的Fun1; 输出6 ,完毕。
}

------解决方案--------------------
毫无悬念的代码,

A 是 A,

B 是 B,

多看几遍代码,
------解决方案--------------------
为什么a.Fun1(1)不是调用B.Fun1(1)呢?

里面已经表明a.了,可能调用b的吗/
overide不是把所有的调用都overide了,否则之前的不白写了,如果有多重overide,难道我们只能调用最后一个overide的方法吗?

多态性是根据对象来的,方法是对象的方法. 多看看书了解基本概念吧.