C++ R6025纯虚拟函数调用:是什么以及如何解决

C++ R6025纯虚拟函数调用:是什么以及如何解决,c++,visual-c++,pure-virtual,C++,Visual C++,Pure Virtual,可以在这里找到答案: url发布人: 请阅读这一页,以便你理解为什么会发生这种情况。你也知道为什么吗 virtual void OnRelease() = 0; 作者: 会起作用,但不是解决问题的正确方法 原始问题 R6025:纯虚拟函数调用 #include <Windows.h> // static lib //file.h class cBaseApplication { public: virtu

可以在这里找到答案:

url发布人:

请阅读这一页,以便你理解为什么会发生这种情况。你也知道为什么吗

        virtual void     OnRelease() = 0;
作者:

会起作用,但不是解决问题的正确方法


原始问题

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;

    }
R6025发生,移除时,除内存泄漏外,其他所有泄漏都会发生。 删除R6025的指针引用也将在“程序退出”时发生,此时应用程序将被销毁

由于嘟嘟声,R6025吓了我一跳:s

似乎我必须在两者之间做出选择,但我只是不想,这里发生了什么

问候,, 约翰

编辑:添加了一些代码,看起来Eran是正确的,因为我确实在那里调用了虚拟函数

编辑:添加到示例中,[virtual void OnLostDevice()=0;]。从抽象到ascoop的转变立即给出了解决方案。开始阅读下面评论中的那一页,因为我感觉自己还没到那里

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


谢谢,John,您不能在构造函数中调用虚函数,也不能在析构函数中调用虚函数。我在这里没有看到纯虚拟函数,但是如果
cBaseApplication::Release
碰巧调用了一个函数,那么每次销毁
cBaseApplication
时都会出现该错误。我不确定这是否是问题所在,因为我没有所有的代码,但您的代码会引发此类问题。

您不能在构造函数和析构函数中调用虚函数。我在这里没有看到纯虚拟函数,但是如果
cBaseApplication::Release
碰巧调用了一个函数,那么每次销毁
cBaseApplication
时都会出现该错误。我不确定这是否是问题所在,因为我没有所有的代码,但您的代码会调用此类问题。

R6025:纯虚拟函数调用--在mesagebox@thb它是由MSVC程序打印的。错误是否发生在上面粘贴的小程序中?或者它只发生在其他程序中,而这只是一个片段?没关系,那个程序甚至都不编译。我有我的问题的答案。请提供一个完整的小程序来演示问题。有关更多信息,请参阅。您是否了解基本
Release()
将被调用两次?(这是你的意图吗?)R6025:纯虚拟函数调用——在mesagebox@thb它是由MSVC程序打印的。错误是否发生在上面粘贴的小程序中?或者它只发生在其他程序中,而这只是一个片段?没关系,那个程序甚至都不编译。我有我的问题的答案。请提供一个完整的小程序来演示问题。有关更多信息,请参阅。您是否了解基本
Release()
将被调用两次?(这是你的意图吗?)你是对的,我确实在析构函数中调用虚函数。临时解决方案,在抽象func上实现了空范围。我正在进一步研究这个答案。我承认这个答案是真的。你是对的,我在析构函数中调用虚函数。临时解决方案,在抽象func上实现了空范围。我正在进一步研究这个答案。我承认这个答案是真的。
#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;

    }
delete pApplication;