Java and C# support the notion of classes that can't be used as base classes with the final
and sealed
keywords. In C++ however there is no good way to prevent a class from being derived from which leaves the class's author with a dilemma, should every class have a virtual destructor or not?
On the one hand giving an object a virtual destructor means it will have a vtable
and therefore consume 4 (or 8 on 64 bit machines) additional bytes per-object for the vptr
.
On the other hand if someone later derives from this class and deletes a derived class via a pointer to the base class the program will be ill-defined (due to the absence of a virtual destructor), and frankly optimizing for a pointer per object is ridiculous.
On the gripping hand having a virtual destructor (arguably) advertises that this type is meant to be used polymorphically.
Some people think you need an explicit reason to not use a virtual destructor (as is the subtext of this question) and others say that you should use them only when you have reason to believe that your class is to be derived from, what do you think?