All of which is a workaround for the fact that there is no explicit way to declare a c++ class to be abstract-only.
What happens if you do have shared logic to put in the abstract base class's destructor? It can't be pure virtual, and you're back to being able to instantiate your 'abstract' base class...