The compiler tries to build the virtual table given a virtual
(pure or not) destructor, and it complains because it can't find the implementation.
virtual
destructors differ from other virtual
functions because they are called when the object is destroyed, regardless of whether it was implemented or not. This requires the compiler to add it to the vf table, even if it's not called explicitly, because the derived class destructor needs it.
Pedantically, the standard requires a pure virtual
destructor to be implemented.