Yes. It's sometimes (not always!) a great idea. For example, suppose
all Shape objects have a common algorithm for printing, but this algorithm
depends on their area and they all have a potentially different way to compute
their area. In this case Shape's area() method would necessarily
have to be virtual (probably pure virtual) but Shape::print()
could, if we were guaranteed no derived class
wanted a different algorithm for printing, be a non-virtual defined in
the base class Shape.
#include "Shape.h"
void Shape::print() const
{
float a = this->area(); // area() is pure virtual
...
}