잉여력이 넘쳐나서 저런 쓸데없는 걸 만들어 봤는데

(메시지 - 메시지 핸들러 함수) 쌍을 HashMap으로 객체 내에 저장하고 wndProc()에서 적절히 찾아내서 메시지핸들러를 실행시키는 거...

클래스 하나에서는 잘 돌아가고, Derived 클래스에서 메시지핸들러를 overriding해도 잘 돌아가지만

Derived 클래스에서 처음으로 (메시지 - 메시지 핸들러 함수) 쌍을 추가하는 경우가 문제...


typedef int A::*MSGHANDLER (int arg);

class A {
        CALLBACK wndProc(int msg);                                        // 이놈이 적절히 msghandler를 골라서 실행한다.
        void addMsgHndlr(int msg, MSGHANDLER mh);        // hashmap에다 (msg-msghandler) 쌍을 저장
        MSGHANDLER getMsgHndlr(int msg);                        // hashmap에서 msghandler를 읽어온다
        virtual int onSize(int arg);                // sample msgHandler
};

A::wndProc(int msg) {
        return (this->*(getMsgHndlr(msg)))(arg);                <i>// 이게 잘 되면 B::wndProc()을 다시 쓸 필요가 없을 텐데...</i>
}
class B : public virtual A {
        virtual int onSize(int arg);        // A::onSize()를 overriding. 적절히 동작한다.
        int onDestroy(int arg);        // A에 등록했던 적이 없는 새로운 msghandler.
};

A a; B b;
a.addMsgHndlr(WM_SIZE, &A::onSize));        // ok
b.addMsgHndlr(WM_NCDESTROY, reinterpret_cast<MSGHANDLER>(&B::onDestroy));        // epic fail. 실행은 되지만 wndProc()에서 segfault

-----------
addMsgHndlr에 인수를 추가해서 msghandler의 owner를 추가로 기록하면서

B::wndproc을 overriding하고 owner가 아니면 다시 A::wndproc을 부르게 하면 될 것도 같지만 
그러면 이짓을 하는 의미가 없음.