[ 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 에 대한 사용법 및 정의. 제한적 사용이지만 강력.
- 상속된 동적 객체의 하위 접근 불가를 풀기 위해 사용한다.
- 주의 사항으로는 너무 남발하면, 구조 및 형식이 무너지니 적당히 쓰고 반드시 원상태로 복구하자.
링크 : Casting의 종류
- 주의 사항으로는 너무 남발하면, 구조 및 형식이 무너지니 적당히 쓰고 반드시 원상태로 복구하자.
[참고 추가 내용]
dynamic_cast는 메모리 상으로 변환이 어떻게 작용이 되어 부모 클래스가 자식 클래스에 접근이 허용 가능한가 것은 바로 자식에게 있는 포인터 주소 ( 뒷자리 주소를 )를 부모에게 넘겨 주어 ( 앞자리 주소로 ) 부모 객체가 자식 객체에 접근 할 수 없는 메소드를 dynamic_cast로 강제적으로나마 접근이 가능한 것이다.
역시 캐스팅의 의미는 형식을 깨고 강제적으로 만든다는 의미이니 잠정적 의미가 많은편이라 static_cast나 const_cast 처럼 가볍게 넘어갈 정도의 cast가 아닌 메모리 문제점이 생길 수 있는 dynamic_cast, reinterpret_cast는 주의 하며 사용하자.
링크 : Casting의 종류
'[ Programing ] > C++' 카테고리의 다른 글
[ 기초 ] 배열 넘기기 (0) | 2010.01.31 |
---|---|
[메모리 누수 발견] INIT_CRTDEBUG(); BREAK_ALLOC( INT ); (0) | 2010.01.31 |
[ 콘솔 창 설정 ] AllocConsole(); freopen( "CONOUT$", "wt", stdout ); (0) | 2010.01.31 |
[ 기초 ] 팁 : 조건문 효율적으로 붙이기 (0) | 2010.01.31 |
[심심풀이] VECTOR 만들기 (0) | 2010.01.31 |