ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [펌] 포인터 캐스팅을 이용한 실제 인터페이스 변경
    Computer Language/C 2007. 8. 24. 16:44
    728x90

    출처 : 데브피아


    제     목 [파샤] 포인터 캐스팅을 이용한 실제 인터페이스 변경 7006 0 whoom@hanmail.net 7006 0 0 
    작 성 자 문채후(whoom)    
     첨부
    파일 
    작성시각 2005-01-14 오후 4:06:03 조 회 수 480
    글 분 류 VC++ 일반
     
     아래 최재욱님의 글을 보다가 문득 생각이나서 글을 적습니다


    포인터 캐스팅을 이용한 인터페이스 변경 기법인데요

    처음봤을때 너무 신기했던 거라서 ㅡ_ㅡ;; 다른분들도 신기해 해야할텐데 걱정이 앞섭니다 ^^


    typedef struct interface;


    interface IBase

    {

        virtual void Play()=0;

        virtual void Show()=0;

    }

       

    Interface IObject : IBase

    {

        virtual void Sound();

    }


    interface IMyBase
    {

        virtual void MyShow()=0;

        virtual void MyPlay() = 0;

    }


    class A : IObject, IMyBase

    {

    public:

        void Show(){cout << "IBase=> Show()" << endl;}

        void Play(){cout << "IBase=> Play()" << endl;}

        void MyShow(){cout << "IMyBase=> Show()" << endl;}

        void MyPlay(){cout << "IMyBase=> Play()" << endl;}

        void Sound(){};

    }

       

    int main ()

    {

        A *a = new A;

        IBase * pIB  = (IObject *)a;

        pIB->Show();

        pIB->Play();

       

        IBase * pIB2 = reinterpret_cast<IBase*>((IMyBase *)a);

        pIB2->Show();

        pIB2->Play();

    }


    결과는

    IBase=> Show()

    IBase=> Play()


    IMyBase=> Play()

    IMyBase=> Show()


    파란색과 녹색의 결과값이 놀랍지 않습니까?

    아마 대부분의 사람들은 파란색 부분과 녹색부분의 결과에 눈이 똥그래 질겁니다

    pIB2->Show(); 를 호출했는데 IMyBase=> Play()라니 ^^



    위 프로그램은

    동일한 IBase * 포인터 이용해서 특정클래스(A)의 인터페이스인

    IBase 인터페이스에 접근하고

    또한 IMyBase 인터페이스에 포인터 캐스팅만을 이용해서 접근하는 기법을 보여줍니다


    중요한것은 IBase 와 IMyBase가 상속관계가 전혀없는 인터페이스라것 입니다

    위 기법의 핵심은 IBase와 IMyBase라는 클래스에

    기술된 vitual 함수의 리턴형과 함수파라메터가 같은데 있습니다


    interface IBase

    {

        virtual void Play()=0;                    

        virtual void Show()=0;

    }


    위 인터페이스에서 Play와 Show의 선언의 순서를 바꾸어서 컴파일해보면

    더 분명하게 그 이유를 알수가 있죠


    어떻게 보면 포인터 캐스팅에 의한 당연한 결과로 보이기도 하지만

    교묘히 상속관계와 단순 포인터 캐스팅을 섞어놔서 결과값을 보고 당황하게 만들죠


    C++을 잘 하는 고수분의 장난같이 보이지 않습니까?

    저도 맨처음에는 어떤 사람이 문제를 내기위한 문제를 고민해서 만들었군 하면서 대수롭지 않게 생각했는데


    나중에 시간이 지나고나서 놀랍게도

    COM 구현중에 내부 컴포넌트 통합을 위한 기본 스킬로 쓰여지고 있는걸 발견했습니다


    ps.

    좀더 쉽게 자세히 글을 쓸걸 하다가 너무 길어질것 같아서

    어짜피 이글을 보시는 분은 기본적인 포인터와 상속, 다형성을 알고계신분일꺼란 생각에 과감히 세세한 설명은 생략했습니다

    내용이 앞뒤가 맞지않고 두서가 없더라도 양해해 주시길... ^^


    강좌/tip란에는 처음글이네요

    나중에 기회가 된다면 패턴에 대한 관련 글을 한번 기술 해보고 싶군요 ^^

    'Computer Language > C' 카테고리의 다른 글

    포인터로 함수 호출하기  (0) 2007.08.24
    함수포인터 타입  (0) 2007.08.24
    [펌] 함수포인터 정의  (0) 2007.08.24
    클래스 맴버함수의 함수 포인터  (1) 2007.08.24
    구조체의 패딩에 대해서...  (2) 2007.03.26

    댓글

Designed by black7375.