基底側から継承側を呼べばいいのです。
class B{
private: virtual void foo_impl( ) = 0;
public: void foo(){ /*code*/ foo_impl( ); /*code*/ }
};
class D{
private: void foo_impl() /*override*/ { /* code_here */ }
};