● 상속과 객체 포인터


업 캐스팅기본 클래스의 포인터 -> 파생 클래스의 객체

클래스 객체를 파생 클래스로 변환하는것



=> 파생 클래스의 객체를 기본 클래스의 객체처럼 다룰 수 있게 한다.


1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    ColorPoint cp;
    ColorPoint *pDer = &cp;
    Point* pBase = pDer; // up-casting
    
    pDer->set(34);
    pBase->showPoint();
    pDer->setColor("Red");
    pDer->showColorPoint();
 
    pBase->showColorPoint(); // 컴파일 오류
}
cs


위에서 showColorPoint()는 부모 클래스인 Point의 멤버가 아니므로 오류가 난다.

-> pBase로는 ColorPoint클래스 중 Point에서 상속 받은 멤버에만 접근이 가능하다.



up-casting 시 다음과 같은 명시적 타입 변환이 필요 없다.


1
Point* pBase = (Point*)pDer; // (Point*) 생략이 
cs


( 왜냐하면 cp객체는 ColorPoint 타입이지만 Point 타입이기도 하기 때문이다. )




다운 캐스팅  :  파생 클래스의 포인터 -> 기본 클래스 포인터가 가리키는 객체

클래스 객체를 기반 클래스로 변환하는것


1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    ColorPoint cp;
    ColorPoint *pDer;
    Point* pBase = &cp;
 
    pBase->set(34);
    pBase->showPoint();
 
    pDer = (ColorPoint*)pBase; // down-casting
    pDer->setColor("Red"); // 정상 컴파일
    pDer->setColorPoint();
}
cs


실행 결과 : 

(3,4)

Red(3,4)


※ down-casting은 명시적으로 타입 변환을 지정해야 한다.



※ down-casting 주의사항


1
2
3
4
5
6
7
8
9
ColorPoint *pDer;
Point *pBase, po;
pBase = &po;
pDer = (ColorPoint*)pBase; // 다운 캐스팅
 
pDer->set(34);
pDer->setColor("Red"); /*setColor는 ColorPoin의 멤버이므로
                       컴파일 오류는 없으나 실행 중 오류가 생김*/
 
cs


=> pDer은 ColorPoint 타입의 포인터이므로 setColor()함수를 호출하는 데에는 문법적인 오류가 없다.

but 이 라인이 실행되면 pDer이 가리키는 객체 공간에는 setColor() 함수가 없기 때문실행중에 오류가 발생하여 비정상 종료한다.

'C++ > C++ 문법' 카테고리의 다른 글

#8-5 가상 상속  (0) 2018.10.07
#8-3 상속과 생성자, 소멸자  (0) 2018.10.07
#8-1 상속  (0) 2018.10.07
#7-B 연산자 중복  (0) 2018.10.07
#07-A 프렌드  (0) 2018.10.05