class MainWindow {
        virtual LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);        
        virtual LRESULT onLButtonUp(WPARAM wParam, LPARAM lParam);
};
class SubWindow : virtual public MainWindow {
        virtual LRESULT onLButtonUp(WPARAM wParam, LPARAM lParam);        // overridden
};

LRESULT MainWindow::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        if(msg==WM_LBUTTONUP) {
                //this->onLButtonUp(wParam, lParam);        // 이걸 실행하면 당연히 SubWindow::onLButtonUp(WPARAM, LPARAM)이 실행될 것이다.

                // 다음과 같이 function pointer를 이용해서 호출해도 derived class의 변경 내용이 적용될까?
                LRESULT (MainWindow::*fp)(WPARAM, LPARAM)= &MainWindow::onLButtonUp;
                return (this->*fp)(wParam, lParam);
        }
}


저래도 subWindow->wndProc() 때 SubWindow::onLButtonUp()이 호출되니 좋군영.

User-defined message map을 만들 수 있겠당.