C++다 중 실현 메커니즘 깊이 이해

3873 단어 c다 형메커니즘
면접 과정 에서 C++의 다 중 실현 체 제 는 면접 관 에 게 자주 물 어 본다.다 태 는 도대체 어떻게 실현 되 어야 하 는 지 아 십 니까?다음은 시간 을 내 서 다 태 적 실현 메커니즘 을 소개 하 겠 습 니 다.
1.virtual 키워드 로 명 시 된 함 수 를 허 함수 라 고 하 는데 허 함 수 는 틀림없이 클래스 의 구성원 함수 일 것 이다.
2.가상 함수 가 존재 하 는 클래스 는 모두 1 차원 의 가상 함수 표를 가상 표 라 고 한다.클래스 의 대상 은 가상 시계 시작 을 가리 키 는 가상 포인터 가 있 습 니 다.허 표 는 클래스 와 대응 하고 허 표 지침 은 대상 과 대응 합 니 다.
3.다 형 성 은 하나의 인터페이스 가 여러 가지 실현 되 고 대상 을 대상 으로 하 는 핵심 이다.클래스 의 다 형 성과 함수 의 다 형 성 으로 나 뉜 다.
4.다 중 은 가상 함수 로 이 루어 지고 동적 바 인 딩 과 결합 합 니 다.
5.순 허 함 수 는 허 함수 에=0 을 더 합 니 다.
6.추상 류 는 최소한 하나의 순 허 함 수 를 포함 하 는 류 를 말한다.
다 태 적 소개
일반적으로 다 태 는 두 가지 로 나 뉘 는데 정적 다 태 와 동적 다 태 이다.정적 다 태 는 컴 파일 시 다 태 라 고도 부 르 는데 주로 템 플 릿 과 리 셋 을 포함한다.한편,동적 다 태 는 클래스 의 계승 과 가상 함 수 를 통 해 이 루어 진다.기본 클래스 와 하위 클래스 가 같은 이름과 같은 참 여 를 가지 고 돌아 오 는 방법 을 가지 고 이 방법 은 가상 방법 이 라 고 성명 한다.기본 클래스 대상,지침,파생 클래스 를 가리 키 는 대상 을 인용 할 때 기본 클래스 의 대상,지침 은 기본 클래스 를 호출 하 는 방법 으로 실제 적 으로 파생 클래스 방법 을 호출 한다.이것 이 바로 동적 다 형 이다.
정적 다 태 적 실현
정적 다 태 는 컴 파일 러 에 의 해 이 루어 집 니 다.쉽게 말 하면 컴 파일 러 가 원래 의 함수 이름 을 수식 하 는 것 입 니 다.c 언어 에서 함수 가 다시 불 러 올 수 없 는 이 유 는 c 컴 파일 러 가 함 수 를 수식 할 때 함수 이름 앞 에 밑줄''만 간단하게 추가 하기 때 문 입 니 다.한편,c+컴 파 일 러 는 함수 의 유형,개수 에 따라 함수 이름 을 수식 한다.그러면 함 수 를 다시 불 러 올 수 있다.마찬가지 로 템 플 릿 도 실현 할 수 있다.서로 다른 유형의 실 참 에 대응 하 는 특 화 된 함 수 를 만 들 고 수식 을 추가 함으로써 서로 다른 유형의 매개 변수의 함 수 를 구분 할 수 있다.
다음 절 차 를 예 로 들 면

#include <iostream>
using namespace std;
template <typename T1, typename T2>
int fun(T1 t1, T2 t2){}
int foofun(){}
int foofun(int){}
int foofun(int , float){}
int foofun(int , float ,double){}
int main(int argc, char *argv[])
{
fun(1, 2);
fun(1, 1.1);
foofun();
foofun(1);
foofun(1, 1.1);
foofun(1, 1.1, 1.11);
return 0;
}
컴 파일 후:

main 함수 부분 만 선택 하여 보기:

이 를 통 해 알 수 있 듯 이 호출 된 함수 이름 이 모두 변화 가 생 겼 고 해당 하 는 수식 을 추가 하여 호출 된 함수 가 다 르 고 정적 다 태 는 바로 이와 같다.
동적 다 태 적 실현
클래스 를 설명 할 때 클래스 에 가상 방법 이 있 으 면 자동 으로 클래스 에 가상 함수 지침 을 추가 합 니 다.이 지침 은 가상 함수 표를 가리 키 고 가상 함수 표 에는 모든 가상 함수 가 진정 으로 대응 하 는 함수 주소 가 저장 되 어 있 습 니 다.동적 다 형 은 지연 바 인 딩 기술 을 사용 합 니 다.일반적인 함수 호출 은 컴 파일 기간 에 호출 된 함수 의 주 소 를 확 정 했 습 니 다.그래서 어떻게 호출 하 든 항상 그 함수 가 있 지만 가상 함수 류 를 가지 고 있 습 니 다.가상 함 수 를 호출 할 때 먼저 가상 함수 표를 찾 은 다음 에 호출 된 함수 가 무엇 인지 확인 합 니 다.그래서..호출 된 함 수 는 실행 할 때 만 확 정 됩 니 다.
기본 클래스 대상 을 설명 할 때,가상 함수 표 에 연 결 된 것 은 기본 클래스 의 방법의 주소 입 니 다.파생 류 대상 을 성명 할 때 허 함 수 표 에 연 결 된 것 이 파생 류 의 방법 이다.대상 이 생 성 된 후(지침 을 예 로 들 면)기본 지침 이 든 파생 지침 이 든 이 대상 을 가리 키 면 가상 함 수 표 는 변 하지 않 습 니 다.
다음 절 차 를 예 로 들 면:

#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun()
{
cout << "this is base fun" << endl;
}
};
class Derived : public Base
{
public:
void fun()
{
cout << "this is Derived fun" << endl;
}
};
int main(int argc, char *argv[])
{
Base b1;
Derived d1;
Base *pb = &d1;
Derived *pd = (Derived *)&b1;
b1.fun();
pd->fun();
d1.fun();
pb->fun();
return 0;
}
실행 결 과 는 다음 과 같 습 니 다.

결 과 를 통 해 알 수 있 듯 이 한 대상 이 생 성 된 후에 가상 함 수 를 호출 할 때 파생 포인터 든 기본 포인터 가 이 대상 을 가리 키 든 가상 함 수 를 호출 한 결 과 는 같다.허 함 수 표 는 변 하지 않 기 때문이다.물론 다 중 계승 에 여러 개의 허 함수 표 가 있어 함수 호출 시 서로 다른 허 함수 표를 호출 할 수 있 습 니 다.여 기 는 고려 하지 않 습 니 다.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 C++다 태 적 실현 메커니즘 의 이해 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.만약 에 궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기