Upcasting

클래스 객체를 기반 클래스로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base
{};

class Derived : public Base
{};

int main()
{
Base *b = new Derived(); // Type Slice와 달리 포인터이므로, 원래의 형만 바꿔준다면 자식의 값과 함수를 사용할수 있음.

// or
Derived *d = new Derived();
Base *b = dynamic_case<Base *>(d);
}
1
2
3
4
5
포트폴리오의 TCP Fighter의 클라이언트에서, CBaseObject가 CEffect, CPlayer의 부모인데, 
가상함수를 통해서 게임 로직처리부는 CBaseObject의 형태의 포인터만 가지고,
Action함수를 통해서 액션처리를 그리고 Draw을 통해서 그리고 있다.

TCP Fighter의 CBaseObject, CPlayer, CEffect와, GameProc.cpp, PacketRecv.cpp파일 참조

깃허브 링크

  1. 형만 정확하다면 묵시적으로 캐스팅된다.
  2. 캐스팅 후 자식 클래스에만 정의되어 있는 메소드에는 접근할수 없다.

객체들을 공통 특성으로 처리할때 사용.

Downcasting

클래스 객체를 파생 클래스형으로 변환하는 것을 다운 캐스팅

1
2
Base* b = new Base();
Derived* d = dynamic_cast<Derived*>(b); // 자식의 인스턴스 포인터에 부모의 포인터를 넘긴다.

당연스럽게도 Derived만 가지고 있는 속성들은 사용하면 문제가 발생한다.