Writing basic classes needs no more definition from the programmer than just declaring a few member functions and variables. But, what if you needed to design a class that was derived from other classes and you wanted to invoke polymorphism with the class instantiation? You would always need to declare the destructor virtual, no exceptions. Failure to do so causes your program to create a memory leak. Rule of the thumb: Always declare destructors virtual when deriving.
For example:
class SomeClass {public: SomeClass(); virtual ~SomeClass();private: // data here}