The purpose of declaring a pure virtual function is to allow Derived classes to inherit only function interfaces.
The purpose of declaring a simple (non-pure) impure virtual function is to let Derived classes inherit the interface and default Implementation of the function.
The purpose of declaring a non-virtual function is to make Derived classes inherit the function interface and a mandatory implementation.
Since non-virtual functions represent immutable (invariant) specialization, they should never be redefined in derived class.
The difference between pure virtual functions, simple (impure) virtual functions, and non-virtual functions is what you get to precisely specify what you want to inherit from derived classes: only inherit interfaces, or an inherited interface and a default implementation, or an inherited interface and a forced implementation. Because these different types of declarations mean things of different fundamental meanings, you must be careful when declaring your member functions. If you do, you should be able to avoid the two most common mistakes of the inexperienced class design.