R6025 Pure虚函数调用:什么是如何解决

1 c++ pure-virtual visual-c++

答案可以在这里找到:

Scott Meyers摘自Effective C++,第三版

url发布者:hmjd

请阅读该页面,以便了解其发生的原因.你也知道为什么要替换

        virtual void     OnRelease() = 0;
Run Code Online (Sandbox Code Playgroud)

通过:

        virtual void     OnRelease(){};
Run Code Online (Sandbox Code Playgroud)

将起作用,但不是正确的解决方法.


原始问题

R6025:纯虚函数调用

#include <Windows.h>

// static lib
    //file.h
    class cBaseApplication
    {
    public:
        virtual          ~cBaseApplication(){ Release(); }
        virtual void     Release()
                         {

                             OnRelease();

                         };
        virtual void     OnRelease() = 0;
    }; // class cBaseApplication

    //file1.h
    class cApplication : public cBaseApplication
    {
    public:
        virtual void     OnRelease()
                         {

                             /* what the heck do something here */

                         };
    }; // class cApplication

// executable
    // file3.h
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
    {

        cApplication* pApplication = new cApplication();

        /*...what the heck, do stuff...*/

        pApplication->Release();
        delete pApplication;      // R6025: pure virtual function call
        pApplication = NULL;

        return 0;

    }
Run Code Online (Sandbox Code Playgroud)

在线

delete pApplication; 
Run Code Online (Sandbox Code Playgroud)

发生R6025,并且在移除时,会发生所有精细但内存泄漏.当cApplication应用程序将被破坏时,在"程序退出"时也会删除指针引用R6025.

由于哔哔声,R6025吓到了我:s

因为看起来我必须在两者之间做出选择,但我只是不想,这里发生了什么?

问候,约翰

编辑:添加了一些代码,似乎Eran是正确的,因为我在那里调用虚函数

编辑:添加到示例,[virtual void OnLostDevice()= 0; ].从抽象变为ascoop提供了一个直接的解决方案.开始在下面的评论中阅读该页面,因为我感觉我还没有.

编辑:我得到答案后,我理解自己的问题.所以我重写了这个问题,所以答案符合这个问题.

谢谢,约翰

era*_*ran 7

您不能在构造函数析构函数中调用虚函数.我没有在这里看到一个纯虚函数,但是如果cBaseApplication::Release碰巧调用一个,你每次破坏时都会得到那个错误cBaseApplication.我不确定这是什么问题,因为我没有所有的代码,但是你的代码需要解决这类问题.