자세 한 설명 C\#가상 방법 virtual

C++,자바 등 수많은 OOP 언어 에서 virtual 의 모습 을 볼 수 있 는데 C\#는 완전히 대상 을 대상 으로 하 는 언어 로 서 물론 예외 가 아니다.
가상 함 수 는 C\#의 프로그램 컴 파일 의 측면 에서 볼 때 다른 일반적인 함수 와 어떤 차이 가 있 습 니까?일반 함 수 는 컴 파일 할 때 실행 파일 에 정적 으로 컴 파일 되 며,상대 주 소 는 프로그램 이 실행 되 는 동안 변 하지 않 습 니 다.즉,죽은 것 입 니 다!한편,가상 함 수 는 컴 파일 하 는 동안 정적 으로 컴 파일 되 지 않 습 니 다.상대 적 인 주 소 는 확실 하지 않 습 니 다.실행 시기 대상 인 스 턴 스 에 따라 호출 할 함 수 를 동적 으로 판단 합 니 다.그 중에서 설명 할 때 정의 하 는 클래스 는 설명 류 라 고 하고 실행 할 때 실례 화 된 클래스 는 인 스 턴 스 류 라 고 합 니 다.
날짐승 새=new 참새();
그러면 날짐승 은 소명 류 이 고 참 새 는 실례 류 이다.
구체 적 인 검사 절 차 는 다음 과 같다.
1.한 대상 의 함 수 를 호출 할 때 시스템 은 이 대상 이 정 의 된 클래스,즉 설명 클래스 를 직접 검사 하고 호출 된 함수 가 가상 함수 인지 확인 합 니 다.
2.가상 함수 가 아니라면 이 함 수 를 직접 실행 합 니 다.가상 키워드,즉 가상 함수 가 있다 면 이 함 수 를 바로 실행 하지 않 고 검사 대상 의 인 스 턴 스 클래스 로 전환 합 니 다.
3.이 인 스 턴 스 클래스 에서 그 는 이 인 스 턴 스 클래스 의 정의 에서 이 가상 함수(override 키 워드 를 통 해)를 다시 실현 하 는 지 확인 합 니 다.있 으 면 OK 는 더 이상 찾 지 않 고 이 인 스 턴 스 클래스 의 이 재 실현 함 수 를 즉시 실행 합 니 다.만약 에 없 으 면 시스템 은 인 스 턴 스 클래스 의 부모 클래스 를 계속 위로 찾 고 부모 클래스 에 대해 방금 인 스 턴 스 클래스 에서 검 사 를 반복 합 니 다.이 가상 함 수 를 다시 불 러 온 첫 번 째 부모 클래스 를 찾 을 때 까지 이 부모 클래스 에서 다시 불 러 온 함 수 를 실행 합 니 다.
이 점 을 알 면 다음 코드 의 운행 결 과 를 이해 할 수 있 습 니 다.

using System;

namespace VirtualMethodTest
{
    class A
    {
        public virtual void Func() //   virtual,          
        {
            Console.WriteLine("Func In A");
        }
    }

    class B : A //   B  A   ,  A   ,B   
    {
        public override void Func() //   override ,          
        {
            Console.WriteLine("Func In B");
        }
    }

    class C : B //   C  A   ,  B   ,C   
    {
    }

    class D : A //   B  A   ,  A   ,D   
    {
        public new void Func() //   new ,           ,       
        {
            Console.WriteLine("Func In D");
        }
    }

    class program
    {
        static void Main()
        {
            A a;         //     a  A    .  A  a    
            A b;         //     b  A    .  A  b    
            A c;         //     c  A    .  A  b    
            A d;         //     d  A    .  A  b    

            a = new A(); //    a  ,A a    
            b = new B(); //    b  ,B b    
            c = new C(); //    b  ,C b    
            d = new D(); //    b  ,D b    

            a.Func();    //   a.Func:1.      A 2.         3.       A,     4.     A     5.     Func In A
            b.Func();    //   b.Func:1.      A 2.         3.       B,     4.     B     5.     Func In B
            c.Func();    //   c.Func:1.      A 2.         3.       C,     4.     C   B,     5.    B  Func   5.     Func In B
            d.Func();    //   d.Func:1.      A 2.         3.       D,    (        ,  D    Func(),     override   ,          ) 4.     D   A,     5.    A  Func   5.     Func In A
            D d1 = new D();
            d1.Func(); //   D   Func(),     Func In D
            Console.ReadLine();
        }
    }
}
이상 은 C\#가상 방법 virtual 에 대한 상세 한 내용 입 니 다.C\#가상 방법 virtual 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기