A pure virtual destructor can be declared, but it must have a definition. 
Although the class will be abstract by default, any derived classes won't be.
struct Abstract
{
     virtual ~Abstract() = 0;
};
Abstract::~Abstract() {}
struct Valid: public Abstract
{
        // Notice you don't need to actually overide the base
        // classes pure virtual method as it has a default
};
int main()
{
    // Abstract        a;  // This line fails to compile as Abstract is abstract
    Valid           v;  // This compiles fine.
}