I believe the rule is that if you have a virtual function, the destructor should be virtual since it implies you are going to use polymorphism. Inheritance does not necessarily mean you are going to use polymorphism, thus virtual destructors are usually only an overhead.