its kinda like this:
constructors can pretty much only be called when you are directly creating the bottom derived class. So the compiler knows all of the constructors all the way up the chain.
destructors however are called on deleting a pointer. This could be a pointer to a base class where the compiler may have no knowledge of the derived class. so delete baseptr; MUST have a virtual destructor to call if its going to be able call it.