Description of the R6025 run-time error in Visual C++

This article discusses an issue that may occur when you are developing a program. If you are still experiencing a problem that resembles the one that this article describes, it may be a different problem. To search for issues related to a specific problem, please include the product name in your search in order to narrow your results. To troubleshoot similar problems, please see the “Similar problems and resolutions” section later in this article.


The C++ program fails and reports the following run-time error:

runtime error R6025
– pure virtual function call


This error occurs when your application indirectly calls a pure virtual member function in a context where a call to the function is not valid. In most cases, the compiler detects this and reports the error when building the application. But depending on how your code is written, sometimes the problem is detected only at run-time.

The error occurs when you indirectly call a pure virtual function within the context of a call to the constructor or destructor of an abstract base class. This is illustrated in the sample code below, along with some more description.


Calling a pure virtual function is a programming error, so you need to find the call to the pure virtual function and rewrite the code so it is not called.

One way to find a call to a pure virtual function is to replace the pure virtual function with an implementation that calls the Windows API function DebugBreak. When using the debugger, DebugBreak will cause a hard-coded breakpoint. When the code stops running at this breakpoint, you can view the callstack to see where the function was called.

Another way to find a call to a pure virtual function is to set a breakpoint on the _purecall function that is found in PureVirt.c. Breaking on this function has the advantage of keeping the stack intact so that you can trace what is occurring.


This behavior is by design.


Note The R6025 error is not documented in the manuals or online help included with Visual C++, versions 2.x or below. However, it is briefly discussed in Part 3 of the Readme.wri file shipped with Visual C++ version 2.0.

Sample code

   /* Compile options needed: none

   class A;

   void fcn( A* );

   class A
       virtual void f() = 0;
       A() { fcn( this ); }

   class B : A
       void f() { }

   void fcn( A* p )

   // The declaration below invokes class B's constructor, which
   // first calls class A's constructor, which calls fcn. Then
   // fcn calls A::f, which is a pure virtual function, and
   // this causes the run-time error. B has not been constructed
   // at this point, so the B::f cannot be called. You would not
   // want it to be called because it could depend on something
   // in B that has not been initialized yet.

   B b;

   void main()


You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

AddThis Social Bookmark Button

Leave a Reply

To prove that you're not a bot, enter this code
Anti-Spam Image