Pure virtual function call


Question about C++. What is the error “pure virtual function call”? When it can be output? Provide the minimum code leading to it.

Those developers encountered this error in a real project, probably spent a lot of time debugging this type of error. Let’s take a closer look at this challenge and try to provide a solution.

How does the virtual functions mechanism work? Usually it is implemented through a “vtbl” (virtual table) – a table with pointers to functions. Each class instance that contains at least one virtual function has a __vtbl pointer to the vtbl table for its class. In the case of an abstract class and a pure virtual function, the pointer is still there, but on the standard handler __pure_virtual_func_called (). Thus, it leads to such an error. 

However, how to call it as a direct attempt will be captured already at the compilation stage?



class Base



    Base () {init (); }

    ~ Base () {}

    virtual void log () = 0;


    void init () {log (); }


class Derived: public Base



    Derived () {}

    ~ Derived () {}

    virtual void log () {std :: cout << "Derived created" << std :: endl; }


int main (int argc, char * argv [])


    Derived d;

    return 0;


Let take a look at what happens when instantiating a child class object that contains vtbl.


Step 1. Construct the base part of the upper level:

a) Set the __vtbl pointer to the vtbl of the parent class;

b) Construct the instance variables of the base class;

c) Run the body of the base class constructor.


Step 2. Inherited part(s) (recursively):

a) Change __vtbl pointer to vtbl descendant class;

b) Construct the child class variables;

c) Execute the body of the child class constructor.


Conclusion: avoid invoking virtual functions in constructors and destructors, both explicit and through other functions.



Leave a Comment