가상 함수 표-C++다 중 실현 원리 분석

참고:http://c.biancheng.net/view/267.html
1.설명
우 리 는 다 중 적 으로 아버지 류 의 지침 이 운행 중 에 자 류 를 가리 키 는 것 을 알 고 있다.그러면 그 실현 원 리 는 무엇 일 까?정 답 은 허 함수 표 입 니 다.
virtual 에 관 한 글 에서 우 리 는 C++다 중 사용 방식 을 상세 하 게 알 게 되 었 다.우 리 는 virtual 키 가 없 으 면 다 중 을 사용 할 수 없다 는 것 을 알 고 있다.
2.가상 함수 표
다음 코드 를 볼 게 요.

class A
{
public:
  int i;
  virtual void func() { cout << "A func" << endl; }
  virtual void func2() { cout << "A func2" << endl; }
  void func3() { cout << "A func3" << endl; }
};
class B : public A
{
  int j;
  void func() { cout << "B func" << endl; }
  void func3() { cout << "B func3" << endl; }
};
int main()
{
  cout << sizeof(A) << ", " << sizeof(B); //   8,12
  return 0;
}
32 비트 컴 파일 모드 에서 프로그램의 실행 결 과 는 8,12 입 니 다.
그러나 코드 에 있 는 virtual 을 삭제 하면 프로그램의 실행 결 과 는 4,8 이다.
이 를 통 해 알 수 있 듯 이 가상 함수 가 있 으 면 클래스 가 차지 하 는 저장 공간 은 가상 함수 가 없 는 것 보다 4 개의 바이트 가 많 습 니 다.이 4 개의 바이트 가 바로 다 중 화 를 실현 하 는 관건 입 니 다.대상 저장 공간의 맨 앞 에 있 는 지침 입 니 다.가상 함수 표 의 주 소 를 저장 합 니 다.이것 은 컴 파일 러 에 의 해 실 현 된 것 입 니 다.
모든 가상 함수 가 있 는 클래스(하위 클래스 포함)에는 가상 함수 표 가 있 습 니 다.
가상 함수 목록 에 가상 함수 의 주 소 를 저장 하고 있 습 니 다.가상 함수 의 주소 이 며,비 가상 함수 가 이 열 에 없습니다.
가상 함 수 는 컴 파일 러 가 실 현 된 것 으로 프로그램 이 실 행 될 때 메모리 에 불 러 옵 니 다.하나의 가상 함 수 는 이러한 종류의 모든 가상 함수 주 소 를 보 여 줍 니 다.
예 를 들 어 위의 코드 에서 클래스 A 의 대상 의 저장 공간 과 가상 함수 표 는 그림 과 같다.

클래스 B 의 대상 의 저장 공간 과 가상 함수 표 는 다음 그림 과 같 습 니 다.

다 중 함수 호출 문 구 는 기본 포인터 가 가리 키 는 대상 에 저 장 된 가상 함수 표 의 주소 로 컴 파일 되 어 있 으 며,가상 함수 표 에서 가상 함수 주 소 를 찾 고,가상 함수 의 일련의 명령 을 호출 합 니 다.
3.코드 예제
위 코드 의 기초 위 에서

A* p = new B();
p->func();	//B func
p->func3();	//A func3
p->func2();	//A func
두 번 째 줄 코드 는 다음 과 같이 실 행 됩 니 다.
4.567917.p 포인터 가 가리 키 는 위치 앞의 4 개의 바이트,즉 대상 이 속 한 클래스(클래스 B)의 가상 함수 표 의 주소(64 비트 컴 파일 모드 에서 8 개의 바이트)를 추출 합 니 다4.567917.허 함수 표 의 주소 에 따라 허 함수 표를 찾 고 허 함수 표 에서 호출 할 허 함수 주 소 를 찾 습 니 다
  • 가상 함수 호출;
  • 여기 서 우 리 는 위의 두 번 째 줄 과 세 번 째 줄 코드 가 각각 클래스 A 와 클래스 B 의 방법 을 실행 하 는 것 을 이해 하기 어렵 지 않 을 것 이다.
    실행 p->func();클래스 B 허 함수 표 의 func()주 소 를 찾 았 습 니 다.클래스 B 가 다시 썼 기 때문에 클래스 B 의 func()주 소 를 저장 합 니 다.
    p->func 3()를 실행 합 니 다.이 때 func 3()는 가상 함수 가 아니 라 가상 함수 목록 을 찾 지 않 고 직접 호출 하 는 p(클래스 A 형식)방법 을 발 견 했 습 니 다.
    마찬가지 로 p->func 2()를 실행 합 니 다.클래스 B 의 가상 함수 표를 찾 습 니 다.클래스 B 가 func 2 를 다시 쓰 지 않 았 기 때문에 클래스 A 의 가상 함수 func 2()의 주 소 를 저장 하기 때문에 클래스 A 의 func 2()방법 을 실 행 했 습 니 다.
    허 함수 표-C++다 중 실현 원리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++허 함수 표 가 다 중 원 리 를 실현 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기