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

R6025 Pure virtual function call: What is and how to resolve

本文关键字:何解决 解决 函数调用 什么 R6025      更新时间:2023-10-16

答案可以在这里找到:

摘自《有效C++,第三版》,作者:斯科特·迈耶斯

网址发布者: HMJD

请阅读该页面,以便您了解为什么会发生这种情况。你也知道为什么要替换

        virtual void     OnRelease() = 0;

由:

        virtual void     OnRelease(){};

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


原始问题

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;
    }

在生产线上

delete pApplication; 

R6025发生,删除时,除内存泄漏外,所有正常情况。删除指针引用 R6025 也会在"程序退出"时发生,当 cApplication 应用程序将被破坏时。

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

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

问候John

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

编辑:添加到示例中,[ 虚拟无效 OnLostDevice() = 0; ]。从抽象到ascoop的改变给出了一个直接的解决方案。开始在下面的评论中阅读该页面,因为我感觉我还没有到达那里。

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

谢谢,约翰

不得在构造函数析构函数中调用虚函数。我在这里没有看到纯虚函数,但是如果cBaseApplication::Release碰巧调用了一个函数,则每次破坏cBaseApplication时都会收到该错误。我不确定这是问题所在,因为我没有所有代码,但是您的代码需要此类问题。