#. 내용
- 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);
}
C++2010. 3. 22. 17:16