2009년 09월 09일
오목
# by | 2009/09/09 21:05 | 미분류 | 트랙백 | 덧글(0)
reinterpret_cast 는 언제쓸까요
코드를 보겠습니다.
float f = 10.0f ;
int i = f ;
이런경우 경고가 뜨죠..
보통 이런경우 C스타일의 강제변환을 합니다.
-> int i = (int)f ;
방법이 틀리진 않았으나,
c++스타일대로 한다면,
비쥬얼스튜디오에서 추천하는 reinterpret_cast를 쓰면 됩니다.
=============================================================
dynamic_cast 와 static_cast는 언제쓸까요
우선 필요한 상황을 만들겠습니다.
Unit클래스를 상속받는 Enemy를 설계했다고 합시다.
경우1)
CEnemy* pEnemy;
CUnit* pUnit= (CUnit*)e ;
이런 상황은 문제없이 작동됩니다.
현재 경우가 c에서도 사용하고있구요.
이런 경우 static_cast와 동일합니다.
경우2)
CUnit* u ;
Enemy* pEnemy = (Enemy*)u ;
이런 상황에 c경우에도 문제가 발생하기때문에
static_cast와 dynamic_cast를 분리시켜 놓았을겁니다.
이런 경우
->Enemy* pEnemy = dynamic_cast<Enemy*>u ;
로 수정해주어야 겠지요.
어떻게 dynamic_cast에서 형변환여부를 어떻게 알수있을까요?
가상함수 테이블을 비교하는 것입니다.
가상함수의 내용이 같다면 부모클래스의 형태로 변환이 가능해지는 것이지요.
※
재미있게도, 경우1과 경우2에서는
static_cast로만으로도 가능합니다.
왜그럴까요..?
단일상속이라는 상황이기 때문입니다.
클래스 A◁-B◁-C 의 형태로 단일상속일 경우
포인터 위치->A
B
C
A, B, C의 클래스의 포인터 위치가 동일위치를 가리키고
부모 클래스는 가장 밑에 있에 있기때문에
접근이 가능해집니다.
다중상속일 경우를 보겠습니다.
A◁-C, B◁-C의 다중상속의 형태로
포인터 위치->A
B
C
되어있다면,
B클래스에서 접근할땐 상관이 없겠으나
A클래스에서 접근할때 문제가 생길 것입니다...
# by | 2009/09/04 11:20 | C++ | 트랙백 | 덧글(0)
◀ 이전 페이지다음 페이지 ▶