업캐스팅
업캐스팅은 기반 클래스 포인터로 파생 클래스의 객체를 가리키는 것을 말한다.
예를 들어 기반 클래스와 파생 클래스가 아래와 같다고 가정하자.
class Base {
public:
int data;
};
class Derived : public Base {
public:
string name;
};
이때 다음과 같이 업캐스팅을 해줄 수 있다.
Base* b;
Derived d;
b = &d;
혹은 간단하게 아래와 같이 사용하는 것도 가능하다.
Base* b = new Derived();
그냥 파생 클래스의 포인터를 사용하지 않고 기반 클래스로 업캐스팅해서 사용하는 것은 기반 클래스를 이용하는 파생 클래스가 다양한 경우 이 다양한 파생 클래스들을 업캐스팅을 통해 단일한 자료형으로 다룰 수 있기 때문이다.
이렇게 단일 자료형으로 만들어준다면 이를 배열 등으로 다룰 수 있기 때문에 반복문 등으로 처리 가능하다는 장점이 생긴다.
단 업캐스팅을 진행하면 기반 클래스의 포인터이기 때문에 기반 클래스의 멤버에만 접근할 수 있기 때문에 파생 클래스에만 있는 새로운 멤버는 사용할 수 없다.
다운캐스팅
업캐스팅을 다시 원래로 돌리는 것으로 생각하면 편하다. 정확히는 기반 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것이다. 이를 통해서 파생 클래스에서만 정의된 멤버를 다시 사용할 수 있다.
단 업캐스팅에 사용되었던 파생 클래스와 동일한 파생클래스로 다운캐스팅을 해주어야 하며, 반드시 명시적으로 형변환을 해주어야 한다.
앞서 업캐스팅에서 예시로 든 클래스 관계를 그대로 사용하면 다운캐스팅은 다음과 같다.
Base* b new Derived();
Derived* d = (Derived*) b;
'Language > C & C++' 카테고리의 다른 글
[C++] 템플릿(template)을 통한 일반화(generic) (0) | 2024.11.13 |
---|---|
[C++] virtual 키워드를 활용한 함수 오버라이딩 및 추상 클래스 (0) | 2024.11.13 |
[C++] 클래스 상속(inheritance) 및 다중 상속 (0) | 2024.11.01 |
[C++] 연산자 오버로딩(operator overloading) (0) | 2024.10.27 |
[C++] 프렌드(friend)를 통한 클래스 멤버 접근 (0) | 2024.10.27 |