C++기본 포인터 와 파생 포인터 간 의 전환 방법 설명
함수 재 부팅 은 같은 역할 영역(또는 같은 클래스)에서 만 발생 합 니 다.함수 이름 은 같 지만 매개 변수 유형 이나 매개 변수 개수 가 다 릅 니 다.함수 재 부팅 은 함수 의 반환 형식 을 통 해 구분 할 수 없습니다.함수 가 돌아 오기 전에 함수 의 반환 유형 을 모 르 기 때 문 입 니 다.
함수 숨 김 과 함수 덮어 쓰 기 는 기본 클래스 와 파생 클래스 사이 에서 만 발생 합 니 다.
함수 숨 김 은 할당 생 류 에서 함수 와 기본 클래스 의 함수 가 같은 이름 이지 만 이 함 수 는 기본 클래스 에서 가상 함수 로 정의 되 지 않 았 습 니 다.이러한 상황 은 함수 의 숨 김 입 니 다.
숨 김 이란 일반적인 호출 방법 을 사용 하 는 것 을 말 합 니 다.파생 클래스 대상 이 이 함수 에 접근 할 때 파생 클래스 의 이 함 수 를 우선 방문 합 니 다.기본 클래스 의 이 함 수 는 파생 클래스 대상 에 게 숨겨 져 있 습 니 다.그러나 숨 기 는 것 은 존재 하지 않 거나 접근 할 수 없다 는 것 을 의미 하지 않 는 다.b->Base::func()를 통 해 기본 클래스 에 숨겨 진 함수 에 접근 합 니 다.
함수 오 버 레이 는 기본 클래스 에서 정 의 된 가상 함수 로 인 한 다 중 현상 을 말한다.어떤 기본 클래스 에서 virtual 로 설명 되 고 하나 이상 의 파생 클래스 에서 재 정 의 된 구성원 함수 입 니 다.용법 형식 은:virtual 함수 반환 형식 함수 이름(매개 변수 표){함수 체}입 니 다.다 형 성 을 실현 하고 파생 류 를 가리 키 는 기본 지침 이나 인용 을 통 해 파생 류 에서 같은 이름 으로 구성원 함 수 를 덮어 씁 니 다.
함수 덮어 쓰기 조건:
기본 지침 과 파생 지침 간 의 전환
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(); //파생 클래스 구성원 함수 호출
종합 적 으로 기본 지침 을 통 해 파생 류 방법(강제 변환 과 가상 함수)에 접근 할 수 있 으 며 파생 류 지침 을 통 해 기본 구성원 함 수 를 호출 하 는 방법(강제 변환 이 라 하 더 라 도)은 존재 하지 않 습 니 다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.