● 상속과 객체 포인터
업 캐스팅 : 기본 클래스의 포인터 -> 파생 클래스의 객체
: 클래스 객체를 파생 클래스로 변환하는것
=> 파생 클래스의 객체를 기본 클래스의 객체처럼 다룰 수 있게 한다.
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(3, 4); pBase->showPoint(); pDer->setColor("Red"); pDer->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(3, 4); 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(3, 4); 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 |