A derived class's destructor (whether or not you explicitly define one) automatically invokes the destructors for member objects and base class subobjects. Member objects are destroyed in the reverse order they appear within the class, then base class subobjects are destroyed in the reverse order that they appear in the class's list of base classes.
You should explicitly call a destructor ONLY in esoteric situations, such as when destroying an object created by the "placement new operator."