This question is different than \'When/why should I use a virtual destructor?\'.
struct B {
virtual void foo ();
~B() {} // <--
There really is no reason for a non-virtual public destructor in a class that is meant to be inherited from. Look at this article, Guideline #4.
Use either a protected non-virtual destructor and shared_ptrs(they have static linking), or a public virtual destructor.