Waterlimon, since you plan never to actually instantiate classes of type Foo you are correct that you do not need virtual functions, and your method for run-time checking that methods have been implemented is fine, at least in debug mode.
But a better option for ensuring things work how you want them to work is to make the constructor of Foo protected rather than inheriting from it in a protected or private way—making the constructor protected ensures no future mistakes can occur when one day you accidentally forget and inherit from it in a public manner.
L. Spiro