C++ 称为terminate的纯虚拟方法

C++ 称为terminate的纯虚拟方法,c++,winapi,C++,Winapi,我正在学习有关MSDN的教程: 它显示了如何创建一个类来在WINAPI中创建窗口 我做了与他们完全相同的事情,只是我将创建代码放在构造函数中 当运行时,它给出一个称为error的纯虚拟方法,并终止程序而不进行解释 template<typename T> class Form { public: Form(std::string Title, std::string Class, /*All other params*/); private:

我正在学习有关MSDN的教程:

它显示了如何创建一个类来在WINAPI中创建窗口

我做了与他们完全相同的事情,只是我将创建代码放在构造函数中

当运行时,它给出一个称为error的纯虚拟方法,并终止程序而不进行解释

template<typename T>
class Form
{
    public:
        Form(std::string Title, std::string Class, /*All other params*/);

    private:
        static LRESULT __stdcall WindowProcedure(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);

    protected:
        HWND WindowHandle = nullptr;
        virtual LRESULT HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam) = 0;
};



template<typename T>
Form<T>::Form(std::string Title, std::string Class, /*All Other Params*/)
{
    WNDCLASSEX WndClass = {/*Filled in with other params*/};

    RegisterClassEx(&WndClass);
    WindowHandle = CreateWindowEx(/*Other params*/, this);
}

template<typename T>
LRESULT __stdcall Form<T>::WindowProcedure(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    T* Data = nullptr;

    switch (Msg)
    {
        case WM_NCCREATE:
        {
            CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
            Data = reinterpret_cast<T*>(pCreate->lpCreateParams);
            SetWindowLongPtr(Hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(Data));
            break;
        }

        default:
        {
            Data = reinterpret_cast<T*>(GetWindowLongPtr(Hwnd, GWLP_USERDATA));
            return Data ? Data->HandleMessages(Msg, wParam, lParam) : DefWindowProc(Hwnd, Msg, wParam, lParam);
        }
    }
    return 0;
}
模板
班级形式
{
公众:
表单(std::string Title,std::string Class,/*所有其他参数*/);
私人:
静态LRESULT\uu stdcall WindowProcedure(HWND HWND、UINT Msg、WPARAM WPARAM、LPARAM LPARAM);
受保护的:
HWND WindowHandle=nullptr;
虚拟LRESULT HandleMessages(UINT Msg、WPARAM WPARAM、LPARAM LPARAM)=0;
};
模板
表单::表单(std::字符串标题、std::字符串类、/*所有其他参数*/)
{
WNDCLASSEX WndClass={/*填入其他参数*/};
RegisterClassEx(&WndClass);
WindowHandle=CreateWindowEx(/*其他参数*/,此参数);
}
模板
LRESULT\uu stdcall表单::WindowProcedure(HWND HWND,UINT Msg,WPARAM WPARAM,LPARAM LPARAM)
{
T*Data=nullptr;
开关(Msg)
{
案例WM\n创建:
{
CREATESTRUCT*pCreate=(CREATESTRUCT*)LPRAM;
数据=重新解释强制转换(pCreate->lpCreateParams);
SetWindowLongPtr(Hwnd、GWLP_USERDATA、reinterpret_cast(Data));
打破
}
违约:
{
数据=重新解释转换(GetWindowLongPtr(Hwnd,GWLP_USERDATA));
返回数据→数据->HandleMessages(Msg,wParam,lParam):DefWindowProc(Hwnd,Msg,wParam,lParam);
}
}
返回0;
}
然后我的主窗口:

class MainWindow : public Form<MainWindow>
{
    public:
        MainWindow(std::string Title, /*Other params*/);
        LRESULT HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam);

        HWND WindowHandle() {return Form::WindowHandle;}
};

MainWindow::MainWindow(std::string Title, std::string Class, /*Other params*/) {}

LRESULT MainWindow::HandleMessages(UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
        case WM_CREATE:
        {
        }
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(WindowHandle(), Msg, wParam, lParam);
    }

    return 0;
}
class主窗口:公共窗体
{
公众:
主窗口(标准::字符串标题,/*其他参数*/);
LRESULT HandleMessages(UINT消息、WPARAM WPARAM、LPARAM LPARAM);
HWND WindowHandle(){返回表单::WindowHandle;}
};
MainWindow::MainWindow(std::string Title,std::string Class,/*其他参数*/){}
LRESULT主窗口::HandleMessages(UINT消息、WPARAM WPARAM、LPARAM LPARAM)
{
开关(Msg)
{
案例WM_创建:
{
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(WindowHandle(),Msg,wParam,lParam);
}
返回0;
}
仅此而已。为什么它会给我这个错误,我该如何修复它

我做了与他们完全相同的事情,只是我将创建代码放在构造函数中

这就是为什么。从构造函数调用
virtual
方法并不能达到预期效果,除非您希望它从层次结构中的当前类调用该方法。当基类构造函数执行时,对象还不是派生类型。如果您从该类的构造函数调用当前类中纯的
virtual
方法,您将得到该错误

我做了与他们完全相同的事情,只是我将创建代码放在构造函数中

这就是为什么。从构造函数调用
virtual
方法并不能达到预期效果,除非您希望它从层次结构中的当前类调用该方法。当基类构造函数执行时,对象还不是派生类型。如果您从该类的构造函数调用当前类中纯的
virtual
方法,您将得到该错误