|
카테고리
이글루링크
최근 등록된 덧글
asgfd
by 김대원 at 01/24 우분투를 아파치 서버 처.. by 문경환 at 01/20 부인분이 좋아 하시겠어요.. by 박민재 at 11/21 리눅스 초보입니다. 검.. by 나그네 at 10/13 리눅스 처음 배우는데,,.. by Radeer at 09/02 g_ppBuffer1 배열 포.. by 지나가던 궁금증 at 06/14 dsd by sd at 04/25 고맙습니다... 파일 .. by 까페느와르 at 04/03 좋은 정보 감사합니다. :) by blueasa at 03/17 도움받고 갑니다. by 孤로운늑대 at 11/24 메뉴릿
이글루 파인더
|
2011년 12월 08일
#include <stdio.h>-ml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />-ml:namespace prefix = o /> class Parent_1 { public: virtual void DoSomething() = 0; }; class Parent_2 { }; class Child : public Parent_1, public Parent_2 { public: void DoSomething() { printf( "child\n" ); } }; int main() { Child *child = new Child; Parent_1 *p1 = static_cast< Parent_1* >( child ); Parent_2 *p2 = static_cast< Parent_2* >( child ); printf( "Child : 0x%08X\n", child ); printf( "P1 : 0x%08X\n", p1 ); printf( "P2 : 0x%08X\n", p2 ); p1 = child; p2 = child; printf( "\n\n" ); printf( "Child : 0x%08X\n", child ); printf( "P1 : 0x%08X\n", p1 ); printf( "P2 : 0x%08X\n", p2 ); p1 = reinterpret_cast< Parent_1* >( child ); p2 = reinterpret_cast< Parent_2* >( child ); // <- 이거 참조하면 뻑남 printf( "\n\n" ); printf( "Child : 0x%08X\n", child ); printf( "P1 : 0x%08X\n", p1 ); printf( "P2 : 0x%08X\n", p2 ); } .. 결과는 아래와 같습니다. Child : 0x00372ED0 P1 : 0x00372ED0 P2 : 0x00372ED4 Child : 0x00372ED0 P1 : 0x00372ED0 P2 : 0x00372ED4 Child : 0x00372ED0 P1 : 0x00372ED0 P2 : 0x00372ED0 같은 instance 라고 해도 참조해야하는 가상테이블 여부에 따라.. 포인터가 달라져야 하거든요. P2 의 경우 static_cast 나 C-Style cast 를 했을경우 P1 과 포인터가 달라져야 하지만.. reinterpret_cast 의 경우 그냥 bit copy 만 일어나기 때문에.. 보시다시피 포인터가 같습니다. 이경우 p2 를 참조할경우.. 동작은 정의되지 않았기 때문에 무슨일이 벌어질지 모릅니다. 보통 돌아는 갑니다만... P1 처럼 동작하는 경우도 있고, 뻑나는 경우도 있고.. 그렇죠. 발견하기 힘들기 때문에.. 고치기도 쉽지 않구요.. 대개의 경우 상속관계에 있으면 별다른 캐스팅 연산자 안써줘도 바로 대입이 됩니다. reinterpret_cast 는.. "안되는 캐스팅을 강제로 한다" 던가 "워닝/에러를 줄이는 용도" 말고는 별 쓸데가 없습니다. char[] 를 int 로 변환한다던가.. 그런 bit copy 용도로만 쓰시구요, 가능한한 static_cast 를 주로 써 주세요... |