C++2010. 3. 22. 17:16

#. 내용
 - dynamic_cast는 포인터끼리 또는 레퍼런스 끼리 변환할 때 사용되며, 변환시 규칙은 다음과 같습니다.
  -> 포인터는 포인터로, 레퍼런스는 레퍼런스로 변환함.
  -> 포인터끼리 변환할 때에도 반드시 상속 계층에 속한 클래스끼리만 변환할 수 있음.

 - dynamic_cast는 부모 타입의 포인터를 자식의 포인터로 다운 캐스팅할 때 사용하며, 캐스팅할 때에도 무조건 변환을 혀옹하지 않고 안전하다고 판단될 때에만 허용합니다. dynamic_cast가 안전하다고 판단하는 경우는 변환 대상 포인터가 부모 클래스형 타입이고, 자식 객체를 가리키고 있을 때 이 포인터를 자식 클래스형 포인터로 다운 캐스팅 하는 경우에 허용합니다. 만약 변환 대상 포인터가 실제로 가리키는 대상이 부모 클래스의 객체라면 안전하지 않다고 판단하고 변환하지 않으며, 이럴 경우 null값을 반환합니다.

 - 만약 포인터가 실제로 가리키는 대상이 기본 클래스의 객체라면 변환하지 않습니다.

#. 제약사항
 -
dynamic_cast 를 사용하기 위해서는 몃가지 제약사항이 있습니다. 제약 사항은 다음과 같습니다.
  -> 상속 관계 안에서만 사용할 수 있다.
  -> 하나 이상의 가상함수를 가지고 있어야 한다.
  -> 컴파일러의 RTTI 설정이 켜져 있어야 한다.

#. 예제
#include <Turboc.h>

class Parent
{
public:
     virtual void PrintMe() { printf("I am Parent\n"); }
};

class Child : public Parent
{
private:
     int num;

public:
     Child(int anum=1234) : num(anum) { }
     virtual void PrintMe() { printf("I am Child\n"); }
     void PrintNum() { printf("Hello Child=%d\n",num); }
};

void main()
{
     Parent P,*pP,*pP2;
     Child C,*pC,*pC2;
     pP=&P;
     pC=&C;

     pP2=dynamic_cast<Parent *>(pC);       // 업 캐스팅-항상 안전하다.
     pC2=dynamic_cast<Child *>(pP2);        // 다운 캐스팅-경우에 따라 다르다.
     printf("pC2 = %p\n",pC2);
     pC2=dynamic_cast<Child *>(pP);         // 캐스팅 불가능
     printf("pC2 = %p\n",pC2);
}

Posted by 쿵캉켕