I do not understand the point about review. When we have dynamically
polymorphic tree of classes then there likely is good reason for it.
That reason is typically that we want to use (and dynamically exchange)
different objects through same interface without knowing the actual
types.
There is relatively useful pattern to separate two concerns of such
interface. Convenient interface of base class (through what the users
of that polymorphic tree use it) is one concern, "template" of virtual
functions (that the derived classes have to fill) is other concern.
These concerns sometimes coincide but not as rule and even not too
commonly. When these are not same then it is easier to make the
"template" virtual functions private and call these from public
"interface" non-virtual functions of base class.
That pattern can be misused to over-engineering (as can every pattern
or feature) but it more commonly simplifies work. When we review
"interface" we can concentrate on how simple is to use it. When
we review implementation of derived class we are only concerned how
accurately the "template" is filled.