728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

파생 클래스는 상속을 통해 기본 클래스를 확장하는데 파생 클래스의 객체에는 기본 클래스에서 선언된 멤버들과 파생 클래스에서 선언한 멤버들이 모두 존재하기 때문에, 파생 클래스 객체를 파생 클래스의 포인터나 기본 클래스의 포인터로 모두 가리킬 수 있다.


업 캐스팅

  • 업 캐스팅(up-casting)이란 파생 클래스의 객체를 기본 클래스의 포인터로 가리키는 것
    • 즉, 파생 클래스의 객체를 기본 클래스의 객체처럼 다룰 수 있게 하는데 파생 클래스 객체가 기본 클래스의 멤버를 포함하기 때문에 가능하다.
  • 아래 코드를 보면 다음과 같다.
    • 기본 클래스 point 타입의 포인터 pBase로 파생 클래스인 ColorPoint 객체를 가리킨다.
    • pBase는 Point 클래스의 포인터 => ColorPoint 객체 내의 Point 클래스 멤버만 접근 가능
    • 따라서 pBase->showColorPoint() 함수를 호출시 컴파일 오류가 발생한다.
  • 즉, 업 캐스팅한 기본 클래스의 포인터로는 기본 클래스의 멤버만 접근할 수 있다.
  • 또한 업 캐스팅 시 명시적 타입 변환이 필요없다.
int main() {
	ColorPoint cp;
	ColorPoint* pDer = &cp;
	Point* pBase = pDer; // 업캐스팅

	pDer->set(3, 4);
	pBase->showPoint();
	pDer->setColor("Red");
	pDer->showColorPoint();
	pBase->showColorPoint(); // 컴파일오류
}


 

다운 캐스팅

  • 기본 클래스 포인터가 가리키는 객체를 파생 클래스의 포인터로 가리키는 것이 다운 캐스팅
  • 업 캐스팅과는 달리 명시적 타입 변환을 지정해야 한다.
  • pBase로는 cp 객체의 멤버 중 Point의 public 멤버만 접근할 수 있지만, pDer로는 cp 객체의 모든 public 멤버를 접근할 수 있다.
int main() {
	ColorPoint cp;
	ColorPoint = *pDer;
	Point* pBase = &cp; // 업 캐스팅

	pBase->set(3, 4);
	pBase->showPoint();

	pDer = (ColorPoint*)pBase; // 다운 캐스팅
	pDer->setColor("Red"); // 정상 컴파일
	pDer->showColorPoint(); // 정상 컴파일
}

 

 

  • 다운 캐스팅에는 아래와 같이 주의해야 하는 상황이 있다.
  • 다운 캐스팅 이후, pDer은 ColorPoint 타입의 포인터이므로 pDer로 setColor() 함수 호출하는 데에는 문법적 오류 xxx
    • 하지만, pDer이 가리키는 객체 공간에 setColor() 함수가 없기 때문에 실행 중 오류가 발생한다.
ColorPoint* pDer;
Point* pBase, po;
pBase = &po;
pDer = (ColorPoint*)pBase; // 다운 캐스팅

pDer->set(3, 4);
pDer->setColor("Red"); // setColor()는 ColorPoint의 멤버이므로 컴파일 오류는 없음
// 없는 함수 호출, 실행 오류 발생!

 

728x90

'Programming Language > C++' 카테고리의 다른 글

[C++] 상속과 생성자, 소멸자  (1) 2023.12.14
[C++] protected 접근 지정  (0) 2023.12.14
[C++] 상속  (1) 2023.12.06
[C++] 단항 연산자 중복과 프렌드로 구현하기  (2) 2023.12.06
[C++] 연산자 중복  (0) 2023.12.06