From Stroustrup's C++ Style and Technique FAQ:
So when should I declare a destructor
virtual? Whenever the class has at
least one virtual function. Having
virtual functions indicate that a
class is meant to act as an interface
to derived classes, and when it is, an
object of a derived class may be
destroyed through a pointer to the
base.
Lots of additional info on when your destructor should be virtual on the C++ FAQ. (thanks Stobor)
What is a virtual member? From the C++ FAQ:
[20.1] What is a "virtual member function"?
From an OO perspective, it is the
single most important feature of C++:
[6.9], [6.10].
A virtual function allows derived
classes to replace the implementation
provided by the base class. The
compiler makes sure the replacement is
always called whenever the object in
question is actually of the derived
class, even if the object is accessed
by a base pointer rather than a
derived pointer. This allows
algorithms in the base class to be
replaced in the derived class, even if
users don't know about the derived
class.
The derived class can either fully
replace ("override") the base class
member function, or the derived class
can partially replace ("augment") the
base class member function. The latter
is accomplished by having the derived
class member function call the base
class member function, if desired.