If a class is intended to be used polymorphically, with derived instances being stored as base pointers/references, its base class' destructor should be either virtual or protected.  In the former case, this will cause object destruction to check the vtable, automatically calling the correct destruc...