C++파생 클래스 와 기본 클래스 의 변환 규칙

공용 파생 류 만 이 기본 클래스 의 진정한 하위 유형 으로 기본 클래스 의 기능 을 완전 하 게 계승 했다.기본 클래스 와 파생 클래스 대상 사이 에는 할당 호 환 관계 가 있 으 며,파생 클래스 에는 기본 클래스 에서 계승 하 는 구성원 이 포함 되 어 있 기 때문에 파생 클래스 의 값 을 기본 클래스 대상 에 부여 할 수 있 으 며,기본 클래스 대상 을 사용 할 때 하위 클래스 대상 으로 대체 할 수 있다.구체 적 으로 다음 과 같은 몇 가지 측면 에 나타난다.파생 대상 은 기본 대상 에 게 값 을 부여 할 수 있다.하위 클래스(즉 공용 파생 클래스)대상 으로 기본 클래스 대상 에 값 을 부여 할 수 있 습 니 다.예 를 들 어 A a1;/기본 클래스 A 대상 a1 B b1 정의;/클래스 A 의 공용 파생 클래스 B 를 정의 하 는 대상 b1 a1=b1;/파생 클래스 B 대상 b1 로 기본 클래스 대상 a1 할당 값 을 할당 할 때 파생 클래스 자신의 구성원 을 버 립 니 다.실제로 할당 이란 데이터 구성원 에 대한 할당 일 뿐 구성원 함수 에 할당 문제 가 존재 하지 않 습 니 다.주의:할당 후 대상 a1 을 통 해 파생 대상 b1 의 구성원 을 방문 하려 고 할 수 없습니다.b1 의 구성원 과 a1 의 구성원 이 다 르 기 때 문 입 니 다.age 가 파생 클래스 B 에 추 가 된 공용 데이터 구성원 이 라 고 가정 하고 아래 의 용법 을 분석 합 니 다:a1.age=23;/오류,a1 에는 파생 클래스 에 추 가 된 구성원 b1.age=21 이 포함 되 어 있 지 않 습 니 다./정확 하 다.b1 에 파생 류 에 추 가 된 구성원 은 하위 유형 관 계 는 단 방향 적 이 고 거 스 를 수 없 는 것 임 을 주의해 야 한다.B 는 A 의 하위 유형 이 므 로 A 는 B 의 하위 유형 이 라 고 할 수 없다.하위 클래스 대상 으로 만 기본 클래스 대상 에 값 을 부여 할 수 있 고 기본 클래스 대상 으로 하위 클래스 대상 에 값 을 부여 할 수 없다.이 유 는 분명 하 다.기본 클래스 대상 은 파생 클래스 의 구성원 을 포함 하지 않 기 때문에 파생 클래스 의 구성원 에 게 값 을 부여 할 수 없다.같은 이치 로 같은 기류 의 다른 파생 류 대상 간 에 도 값 을 부여 할 수 없다.파생 클래스 대상 은 기본 클래스 대상 을 대체 하여 기본 클래스 대상 에 대한 인용 을 할당 하거나 초기 화 할 수 있 습 니 다.기본 클래스 A 대상 a1 이 정의 되 어 있 으 면 a1 의 인용 변 수 를 정의 할 수 있 습 니 다:A a1;/기본 클래스 A 대상 a1 B b1 정의;/공용 파생 클래스 B 대상 b1 A&r=a1 정의;/기본 클래스 A 대상 의 인용 변수 r 를 정의 하고 a1 로 초기 화 할 때 인용 변수 r 는 a1 의 별명 이 며 r 와 a1 은 같은 저장 소 를 공유 합 니 다.하위 클래스 대상 으로 인용 변수 r 를 초기 화하 고 위의 마지막 줄 을 A&r=b1 로 바 꿀 수도 있 습 니 다./기본 클래스 A 대상 의 인용 변수 r 를 정의 하고 파생 클래스 B 대상 b1/로 위의 세 번 째 줄 인'A&r=a1'을 초기 화하 거나 유지 합 니 다.r 에 대한 재 할당:r=b1;/파생 클래스 B 대상 b1 대 a1 의 인용 변수 r 할당 주의:이때 r 는 b1 의 별명 이 아니 며 b1 과 같은 저장 부 를 공유 하지 않 습 니 다.이것 은 b1 의 기본 클래스 부분의 별명 일 뿐 r 는 b1 의 기본 클래스 부분 과 같은 저장 소 를 공유 하고 r 는 b1 과 같은 시작 주 소 를 가지 고 있 습 니 다.함수 의 매개 변수 가 기본 클래스 대상 이나 기본 클래스 대상 의 참조 라면 해당 하 는 실제 참 조 는 하위 클래스 대상 을 사용 할 수 있 습 니 다.만약 에 한 함수
 
fun: void fun(A& r)// A
{
cout<<r.num<<endl;
} // num
A , A 。 , , fun B b1 : fun(b1); B b1 num 。 , fun 。
, , 。
11.10 Student( ), Student Graduate( ), 。 , , 。 num( ),name( ) score( )3 ,Graduate pay( )。
:
[code]
#include <iostream>
#include <string>
Graduate::Graduate(int n, string nam,float s,float p):Student(n,nam,s),pay(p){ }
using namespace std;
class Student// Student
{
public :
Student(int, string,float );//
void display( );//
private :
int num;
string name;
float score;
};
Student::Student(int n, string nam,float s) //
{
num=n;
name=nam;
score=s;
}
void Student::display( )//
{
cout<<endl<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″score:″<<score<<endl;
}
class Graduate:public Student// Graduate
{
public :
Graduate(int, string ,float ,float );//
void display( );//
private :
float pay;//
};
//
void Graduate::display() //
{
Student::display(); // Student display
cout<<″pay=″<<pay<<endl;
}
int main()
{
Student stud1(1001,″Li″,87.5); // Student stud1
Graduate grad1(2001,″Wang″,98.5,563.5); // Graduate grad1
Student *pt=&stud1;// Student stud1
pt->display( ); // stud1.display
pt=&grad1; // grad1
pt->display( ); // grad1.display
}
가 있 으 면 많은 독자 들 은 파생 류 에 같은 이름 의 display 구성원 함수 가 두 개 있 고 같은 이름 으로 덮어 쓰 는 규칙 에 따라 파생 류 Graduate 대상 의 display 함수 가 호출 되 어야 한다 고 생각 할 것 이다.Graduate:display 함수 과정 에서 Student:display 함수,출력 num,name,score 를 호출 한 다음 에 pay 의 값 을 출력 해 야 한다.사실 이러한 추론 은 잘못된 것 입 니 다.먼저 프로그램의 출력 결 과 를 보십시오.num:1001 name:Li score:87.5 num:2001 name:wang score:98.5 는 pay 의 값 을 출력 하지 않 았 습 니 다.문 제 는 pt 가 Student 류 대상 을 가리 키 는 포인터 변수 입 니 다.grad 1 을 가리 키 더 라 도 실제 pt 는 grad 1 에서 기본 적 인 계승 부분 을 가리 키 고 있 습 니 다.기본 대상 을 가리 키 는 지침 을 통 해 파생 류 의 기본 구성원 만 방문 할 수 있 고 파생 류 가 증가 하 는 구성원 은 방문 할 수 없다.그래서 pt->display()는 파생 클래스 Graduate 대상 에 추 가 된 display 함수 가 아니 라 기본 클래스 의 display 함수 이기 때문에 대학원 grad 1 의 num,name,score 3 개의 데이터 만 출력 합 니 다.대학원 grad 1 의 pay 를 포인터 로 출력 하려 면 파생 대상 을 가리 키 는 포인터 변 수 를 따로 설정 하여 grad 1 을 가리 키 고 ptr->display()로 파생 대상 의 display 함 수 를 호출 할 수 있 습 니 다.불편 합 니 다.이 예 를 통 해 알 수 있 듯 이 기본 대상 을 가리 키 는 포인터 변수 로 하위 대상 을 가리 키 는 것 은 합 법 적 이 고 안전 하 며 컴 파일 상의 오류 가 발생 하지 않 습 니 다.그러나 응용 에 있어 서 사람들의 희망 을 완전히 만족 시 키 지 못 하고 사람들 은 가끔 기본 지침 을 사용 하여 기본 클래스 와 하위 대상 의 구성원 을 호출 할 수 있 기 를 원한 다.우 리 는 다음 에 이 문 제 를 해결 할 것 이다.방법 은 허 함수 와 다 형 성 을 사용 하 는 것 이다.

좋은 웹페이지 즐겨찾기