C++기본 포인터 와 하위 포인터 가 서로 값 을 부여 하 는 실현 방법

우선,기본 동물 과 하위 fish 를 드 립 니 다.

//============================================================== 
//   animal.h 
// 
// author : zwq 
// describe:        ,           ,       
//             。 
//============================================================== 
#ifndef ANIMAL_H 
#define ANIMAL_H 
 
//=============================================================== 
// 
//    animal 
//         
// 
//=============================================================== 
class animal 
{ 
public: 
 void breathe();  //      
}; 
 
//=============================================================== 
// 
//      animal 
//      ,        
// 
//=============================================================== 
class fish : public animal 
{ 
public: 
 void breathe();  //      
}; 
 
#endif 

#include "StdAfx.h" 
#include <iostream> 
#include "Animal.h" 
 
using namespace std; 
 
//=============================================================== 
// 
//    animal 
//         
// 
//=============================================================== 
 
void animal::breathe() 
{ 
 cout << "animal breathe" << endl; 
} 
 
//=============================================================== 
// 
//      animal 
//      ,        
// 
//=============================================================== 
 
void fish::breathe() 
{ 
 cout << "fish bubble" << endl; 
} 
기본 포인터 와 하위 포인터 간 의 상호 할당
(1)하위 포인터 의 값 을 기본 포인터 에 할당 할 때 강제 형식 변환 이 필요 하지 않 으 며,C++컴 파 일 러 는 자동 으로 형식 변환 을 진행 합 니 다.하위 대상 도 기본 대상 이기 때문이다.
(2)하위 포인터 에 기본 포인터 값 을 부여 할 때 강제 형식 변환 이 필요 하 며,C++컴 파 일 러 는 자동 으로 형식 변환 을 하지 않 습 니 다.기본 대상 은 하위 대상 이 아니 기 때문이다.하위 대상 의 자체 증가 부분 은 기본 클래스 가 가지 고 있 지 않다.
다음 코드 를 실행 하여 어떤 오 류 를 보고 할 지 보십시오.

int main(int argc, char* argv[]) 
{ 
 ExamAnimal(); 
 
 return 0; 
} 
 
void ExamAnimal() 
{ 
 //              ,       ,C++            
 //   fish      animal   
 animal* pAn; 
 fish* pfh = new fish; 
 pAn = pfh; 
  
 delete pfh; 
 pfh = NULL; 
  
 //              ,      ,C++              
 //   animal      fish   
 fish* fh1; 
 animal* an1 = new animal; 
 //            
 fh1 = an1; 
 
 delete an1; 
 an1 = NULL; 
} 
컴 파일 할 때 다음 과 같은 오류 정 보 를 알려 줍 니 다.
--------------------Configuration: CPlusPlusPrimer - Win32 Debug-------------------- Compiling... CPlusPlusPrimer.cpp E:\Study\example\CPlusPlusPrimer\CPlusPlusPrimer.cpp(94) : error C2440: '=' : cannot convert from 'class animal *' to 'class fish *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Error executing cl.exe.
CPlusPlusPrimer.exe - 1 error(s), 0 warning(s)
상기 오 답 제시 정보 에 따라 코드 를 다음 과 같이 수정 합 니 다.

void ExamAnimal() 
{ 
 //              ,       ,C++            
 //   fish      animal   
 animal* pAn; 
 fish* pfh = new fish; 
 pAn = pfh; 
  
 delete pfh; 
 pfh = NULL; 
  
 //              ,      ,C++              
 //   animal      fish   
 fish* fh1; 
 animal* an1 = new animal; 
 //    : 
 //          
 fh1 = (fish*)an1; 
 
 delete an1; 
 an1 = NULL; 
} 
재 컴 파일,통과.
2.하위 포인터 가 기본 포인터 에 부여 할 때 메모리 분석
(1)int 변 수 는 char 변 수 를 부여 합 니 다.

정형 int 가 char 형식 으로 바 뀌 었 을 때 한 바이트 의 내용 만 char 형식 에 넣 을 수 있 고 나머지 세 바이트 의 내용 은 놓 을 수 없 으 며 잘 리 고 정밀도 가 없습니다.두 변수 나 대상 이 전환 할 때 반드시 두 개의 메모리 모델 이 서로 일치 하 는 지 봐 야 한다.
(2)하위 fish 지침 은 기본 동물 지침 에 부여 한다.

다음은 하위 fish 지침 이 기본 동물 지침 에 부여 되 었 을 때 메모리 의 변 화 를 살 펴 보 겠 습 니 다.우리 가 fish 류 의 대상 을 구성 할 때 먼저 animal 류 의 구조 함 수 를 호출 하여 animal 류 의 구조 함 수 를 구성 한 다음 에 fish 류 의 구조 함 수 를 호출 하여 자신의 부분의 구 조 를 완성 하여 완전한 fish 대상 을 연결 해 야 합 니 다.우리 가 fish 류 대상 을 animal 류 대상 으로 바 꿀 때 이 대상 은 원래 대상 의 전체 메모리 모델 의 상반부,즉 그림 속 animal 대상 의 메모리 부분 으로 여 겨 진다.우리 가 형식 변환 후의 대상 지침 을 이용 하여 그것 을 호출 하 는 방법 은 당연히 그것 이 있 는 메모리 에 있 는 방법 을 호출 하 는 것 이다.여기 서 animal 류 대상 은 char 유형의 대상 과 유사 하고 fish 류 대상 은 int 유형의 대상 과 유사 하 며 fish 류 대상 을 animal 류 대상 에 게 부여 할 때 fish 류 대상 자체 의 부분 을 잘라 내 고 fish 류 대상 중의 animal 부분 을 남긴다.
(3)기본 동물 지침 은 하위 fish 지침 에 부여 한다.
기본 적 인 animal 대상 에 포 함 된 정보 가 적 고 fish 대상 에 포 함 된 정보 가 많 으 며 정보 가 적은 대상 을 정보 가 많은 대상 으로 직접 전환 할 때(강제 유형 전환 이 없 음)많은 정 보 를 구성 할 수 없 음 이 분명 하 다.컴 파일 할 때 다음 과 같은 오류 가 발생 할 수 있 습 니 다:error C2440:'=':cannot convert from'class animal*'to'class fish*'.이 때 강제 형식 변환 이 필요 합 니 다.

//              ,      ,C++              
//   animal      fish   
fish* fh1; 
animal* an1 = new animal; 
//          
fh1 = (fish*)an1; 
이상 은 여러분 에 게 가 져 온 C++기본 포인터 와 하위 포인터 가 서로 값 을 부여 하 는 실현 방법 에 대한 모든 내용 입 니 다.많은 응원 부 탁 드 리 겠 습 니 다~

좋은 웹페이지 즐겨찾기