(C ++)如何在Window程序中使用虚函数?

时间:2015-01-12 21:32:43

标签: c++ windows winapi

我正在尝试为WM_LBUTTONDOWN消息发生一个事件(仅使用带有随机文本的简单消息框进行测试)。如果它是该过程的同一类的成员,它可以正常工作 - 除非它是虚拟的。嗯,这有用,但我有点需要它是虚拟的,所以我可以在实际的场景中实现它。

我试着查找一些东西,但我并没有真正找到确切的问题。所以,我希望你们能帮助我。我不认为我在这里需要我的代码,因为这是一个相当普遍的问题。

编辑: 哇,我没想到会有这么多答案!对不起,我花了这么长时间才回来。  差不多,我想要做的就是当用户点击窗口时,会弹出一个消息框 - 除了从窗口过程所在的不同的类中执行此操作。

示例:

class One{
    // Other stuff

    virtual void Function() {}

    LRESULT WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
        // Other messages
        case WM_LBUTTONDOWN:
            Function();
            break;
    }
}

class Two : public One{
    void Function(){ MessageBoxA(0, "Hi!", "Hello", MB_OK); }
}

这样,我可以用不同的方式实现这个功能。

1 个答案:

答案 0 :(得分:5)

抱歉,不能(不是直接):Windows需要C函数,并且不会为您提供this指针。但是,您可以使用this存储GWLP_USERDATA,然后在常规函数中检索它。 (使用Get/SetWindowLongPtr)。然后,您可以调用虚拟函数。

在幕后,所有Windows编译器都使用vtable进行虚拟调用,但是Windows无法找到并且不能使用该vtable来调用Window过程。