2011-07-27 2 views
0

이 음영과 겹쳐 관련된 MSDN의 예 중 하나는 다음과 A = B 보낸섀도 잉과 오버라이드?

using System; 

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

      Console.WriteLine(); 
     } 
    } 
} 


A.F(); 
B.F(); 
B.G(); 
B.G(); 

I was expecting the out put will be 
B.F(); //change is here 
B.F(); 
B.G(); 
B.G(); 

; a는 b 객체 참조를 보유하므로 호출 유도 클래스 함수를가집니다.

왜 A의 기능이 호출 되었습니까?

답변

0

a는 실제로 유형 B의 변수이지만 명시 적으로 유형 A (A a = b;) 인 변수이므로 실행시 a는 유형 A로 선언되므로 A의 F() 메서드가 호출됩니다.

희망이 도움이되었습니다!

N.S.

+0

Aa = b; 그것은 변수 a가 클래스 A의 데이터 만 가지고 있지 않다는 것을 의미합니다. – Raghavendra

+0

예, b가 B 타입의 객체를 가리키고있는 동안, a의 포인터는 A 타입이므로 컴파일 타임에 호출되는 메소드는 암시 적으로 A.의 구현 그것은 클래스 A의 데이터를 보유 할 것이지만 여전히 유형 B (유형 A이기도 함) 일 것입니다. –