자세 한 설명 C\#가상 방법 virtual
가상 함 수 는 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 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.