블로그는 나의 힘!
[ Programing ]/C++2010. 1. 31. 07:07
[ Dynamic_cast< class object*>() ] 애매한 동적캐스트에 대한 정의.
 
class Base { void Test1(); }
class ITem : public Base { void Test2(); }
 
void main () {
   Base* cBase = new ITem();
 
   // Error!!! 상위 객체는 하위 객체 접근 불가
   // 컴파일러에서는 상속이 되어 있으면 타입이 다른걸 인정
   // 메모리상에서는 하위 객체 함수 쓰는데 접근 제한
   cBase->Test2();     
 
   // 접근 제한 풀기 위해 상속된 객체로 dynamic_cast 사용
   // 이론상 최상위 주소로 캐스트 하기 위해 사용
   // 캐스팅 잘못시 (하위객체가 없다면) bad_cast 리턴하여 캐스팅이 안된다.
   // bad_cast는 채킹이 가능한 고정 변수가 리턴( 컴파일 프로그램에 따라 다르니 찾아 볼것)
   // 장점은 제한적인것을 풀어 버리는 것으로 강력한 기능을 구현.
   // 단점은 클래스 구조가 엉망이 되니 구조를 철저히 한다면 반드시 생각하고 사용.
   dynamic_cast<ITem*>( cBase );
 
   cBase->Test2();    // 사용 가능
}
 
///////////////////////////////////////////////////////////////////////////////////////////// 응용 1
 
class Base { void Test1(); }
class ITem : public Base { void Test2(); }
 
void main () {
   std::map< int, Base* > m_mapItem;
   // 중략 ..... Item 객체를 map의 Base KEY 에 넣는다.
  
   (*itr).second->Render;  // 이렇게 호출시. 하위 지역 함수를 호출 할려면. 동적 캐스트 필요.  
}
 
///////////////////////////////////////////////////////////////////////////////////////////// 응용 2
 
class Base { void Test1() {} }
class Derived : public Base { void Test2() {} }
 
void main()
{
   Base* pBase = new Derived();
   Derived* pDerived = NULL;
 
   pDerived = pBase; // Error!!!
   pDerived = Dynamic_cast<Derived*>pBase;       // OK!!!!
}


 - dynamic_cast 에 대한 사용법 및 정의. 제한적 사용이지만 강력.
 - 상속된 동적 객체의 하위 접근 불가를 풀기 위해 사용한다.
 - 주의 사항으로는 너무 남발하면, 구조 및 형식이 무너지니 적당히 쓰고 반드시 원상태로 복구하자.




[참고 추가 내용] 
dynamic_cast는 메모리 상으로 변환이 어떻게 작용이 되어 부모 클래스가 자식 클래스에 접근이 허용 가능한가 것은 바로 자식에게 있는 포인터 주소 ( 뒷자리 주소를 )를 부모에게 넘겨 주어 ( 앞자리 주소로 ) 부모 객체가 자식 객체에 접근 할 수 없는 메소드를 dynamic_cast로 강제적으로나마 접근이 가능한 것이다. 
역시 캐스팅의 의미는 형식을 깨고 강제적으로 만든다는 의미이니 잠정적 의미가 많은편이라 static_cast나 const_cast 처럼 가볍게 넘어갈 정도의 cast가 아닌 메모리 문제점이 생길 수 있는 dynamic_cast, reinterpret_cast는 주의 하며 사용하자.
Posted by Mister_Q