> a virtual destructor is only required when the class, or its base classes, already have another virtual function
Your derived class only needs a virtual destructor if the base class's destructor is public. If the base class destructor is protected (or private), then no one can call delete on a pointer to a base class.