What can cause a pure virtual function call in C++?

“The most common error I’ve seen that causes this is calling a virtual function from a base class constructor or destructor.”

When an object is constructed, the pointer to the virtual dispatch table is initially aimed at the highest superclass, and it’s only updated as the intermediate classes complete construction. So, you can accidentally call the pure virtual implementation up until the point that a subclass – with its own overriding function implementation – completes construction. That might be the most-derived subclass, or anywhere in between.

It might happen if you follow a pointer to a partially constructed object (e.g. in a race condition due to async or threaded operations).

If a compiler has reason to think it knows the real type to which a pointer-to-base-class points, it may reasonably bypass the virtual dispatch. You might confuse it by doing something with undefined behaviour like a reinterpret cast.

During destruction, the virtual dispatch table should be reverted as derived classes are destroyed, so the pure virtual implementation may again be invoked.

After destruction, continued use of the object via “dangling” pointers or references may invoke the pure virtual function, but there’s no defined behaviour in such situations.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)