C++기본 포인터 와 파생 포인터 간 의 전환 방법 설명

함수 과부하,함수 숨 김,함수 덮어 쓰기
함수 재 부팅 은 같은 역할 영역(또는 같은 클래스)에서 만 발생 합 니 다.함수 이름 은 같 지만 매개 변수 유형 이나 매개 변수 개수 가 다 릅 니 다.함수 재 부팅 은 함수 의 반환 형식 을 통 해 구분 할 수 없습니다.함수 가 돌아 오기 전에 함수 의 반환 유형 을 모 르 기 때 문 입 니 다.
함수 숨 김 과 함수 덮어 쓰 기 는 기본 클래스 와 파생 클래스 사이 에서 만 발생 합 니 다.
함수 숨 김 은 할당 생 류 에서 함수 와 기본 클래스 의 함수 가 같은 이름 이지 만 이 함 수 는 기본 클래스 에서 가상 함수 로 정의 되 지 않 았 습 니 다.이러한 상황 은 함수 의 숨 김 입 니 다.
숨 김 이란 일반적인 호출 방법 을 사용 하 는 것 을 말 합 니 다.파생 클래스 대상 이 이 함수 에 접근 할 때 파생 클래스 의 이 함 수 를 우선 방문 합 니 다.기본 클래스 의 이 함 수 는 파생 클래스 대상 에 게 숨겨 져 있 습 니 다.그러나 숨 기 는 것 은 존재 하지 않 거나 접근 할 수 없다 는 것 을 의미 하지 않 는 다.b->Base::func()를 통 해 기본 클래스 에 숨겨 진 함수 에 접근 합 니 다.
함수 오 버 레이 는 기본 클래스 에서 정 의 된 가상 함수 로 인 한 다 중 현상 을 말한다.어떤 기본 클래스 에서 virtual 로 설명 되 고 하나 이상 의 파생 클래스 에서 재 정 의 된 구성원 함수 입 니 다.용법 형식 은:virtual 함수 반환 형식 함수 이름(매개 변수 표){함수 체}입 니 다.다 형 성 을 실현 하고 파생 류 를 가리 키 는 기본 지침 이나 인용 을 통 해 파생 류 에서 같은 이름 으로 구성원 함 수 를 덮어 씁 니 다.
함수 덮어 쓰기 조건:
  • 1:기본 클래스 의 구성원 함수 가 virtual 키워드 에 의 해 가상 함수 로 설명 되 었 습 니 다
  • 4.567917.2:파생 류 에서 이 함 수 는 기본 클래스 에서 함수 의 이름,매개 변수 유형 과 개수 등 과 완전히 일치 해 야 합 니 다4.567917.3:파생 류 의 대상 을 기본 지침 이나 인용 에 부여 하여 다 형 을 실현 한다함수 덮어 쓰기(다 중)는 기본 클래스 접근(서로 다른)파생 클래스 의 방법 을 실현 합 니 다.우 리 는 그것 을 기류 의 역습 이 라 고 부른다.
    기본 지침 과 파생 지침 간 의 전환
    1.기본 지침 은 기본 대상,파생 지침 은 파생 대상 을 가리킨다.
    이런 상황 은 자주 사용 되 는데 대응 류 의 지침 을 통 해 대응 류 의 기능 을 직접 호출 하면 된다.
    
    #include<iostream>
    using namespace std;
    class Father{
    public:  
      void print()
      {
        printf("Father's function!");
      }
    };
    class Son:public Father
    {
    public:
      void print()
      {
        printf("Son's function!");
      }
    };
    int main()
    {
      Father f1;
      Son s1;
      Father* f = &f1;
      Son* s = &s1;
      f->print();
      cout<<endl<<endl;
      s->print();
    }
    2.기본 포인터 가 파생 대상 을 가리킨다.
    이러한 상황 은 허 용 됩 니 다.하나의 기본 포인터 와 하나의 파생 대상 을 정의 하여 기본 포인터 가 파생 대상 을 가리 키 지만 주의해 야 합 니 다.보통 상황 에서 지침 은 기본 클래스 의 구성원 함수 로 호출 됩 니 다.네 가지 상황 으로 나 뉜 다.
    1.함 수 는 기본 클래스 와 파생 클래스 에 모두 존재 합 니 다.
    이 때'파생 클래스 대상 을 가리 키 는 기본 포인터'를 통 해 구성원 함 수 를 호출 하고 기본 클래스 의 구성원 함 수 를 호출 합 니 다.
        Father f1;
        Son s1;
        Father* f = &s1;
        f->print();  //기본 구성원 함수 호출
    2.함 수 는 기본 클래스 에 존재 하지 않 고 파생 클래스 에 존재 합 니 다.
    기본 클래스 의 구성원 함 수 를 호출 하기 때문에 기본 포인터 로 파생 클래스 에 있 는 구성원 함 수 를 호출 하려 고 하면 컴 파일 러 가 잘못 보고 합 니 다.
    error C2039:"xxx":"Father"멤버 아니에요.
    3.기본 지침 을 파생 지침 으로 강제 전환
    이것 은 아래 의 강제 형식 전환 입 니 다.전환 후'파생 류 를 가리 키 는 기본 지침'은 파생 류 의 구성원 함수 에 접근 할 수 있 습 니 다.
        Son s1;
        Father* f = &s1;
        Son *s = (Son*)f;
        s->print1(); //파생 클래스 구성원 함수 호출
    그러나 이런 강제 전환 작업 은 잠재 적 인 위험 조작 이다.
    4.기본 클래스 에 가상 함수 가 존재 하 는 경우
    기본 클래스 의 구성원 함수 가 가상 함수 로 정의 되 고 파생 클래스 에서 도 이 함 수 를 실현 한다 면'파생 류 를 가리 키 는 기본 포인터'를 통 해 가상 함 수 를 방문 하고 파생 류 에서 의 실현 을 방문 합 니 다.'기본 포인터 가 파생 류 를 가리 키 는 것'이라는 조작 을 허용 합 니 다.가장 큰 의 미 는 바로 여기에 있 습 니 다.가상 함수 와 함수 로 덮어 서'다 중'(서로 다른 파생 류 를 가리 키 며 서로 다른 기능 을 실현 합 니 다)을 실현 합 니 다.
        Father f1;
        Son s1;
        Father* f = &s1;
        f->print();   //파생 클래스 구성원 함수 호출
    3.파생 포인터 가 기본 대상 을 가리킨다.
    컴 파일 오류 가 발생 할 수 있 습 니 다.기본 대상 은 파생 대상 으로 간주 되 지 않 으 며 파생 류 에는 파생 류 만 있 는 구성원 이나 구성원 함수 가 있 을 수 있 습 니 다.
    강제 변환 을 사용 하 더 라 도 파생 포인터 를 기본 포인터 로 강제 변환 합 니 다.이'기본 클래스 를 가리 키 는 파생 포인터'를 통 해 접근 하 는 함 수 는 여전히 파생 클래스 의 구성원 함수 입 니 다.
        Father f1;
        Son s1;
        Son* s=&s1;
        Father* f = (Father*) s;
        f->print();  //파생 클래스 구성원 함수 호출
    종합 적 으로 기본 지침 을 통 해 파생 류 방법(강제 변환 과 가상 함수)에 접근 할 수 있 으 며 파생 류 지침 을 통 해 기본 구성원 함 수 를 호출 하 는 방법(강제 변환 이 라 하 더 라 도)은 존재 하지 않 습 니 다.
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기