When the game engine determines that an UFO collides with another UFO, the latter is responsible for doing the proper effects (damage and such).
Example: Ship collides with generic UFO.
Ship::collideWithUFO(UFO u) {
u.collideWithShip(this);
}
UFO::collideWithShip(Ship s) {
/* Subclass responsibility.
* Example:
* s.takeDamage(50);
*/
}