Add virtual destructors

If a class has virtual functions and not a virtual destructor,
the behaviour when deleting a child-class object is undefined
(memory leaks, crashes, etc)