Polymorphism works when you can do everything you want to every object through the interface defined in the base class. Once you start trying to use functionality not defined at the base level, you have to leave it behind, decide what kind of object it is then start doing class-specific stuff, which by definition is not polymorphic.
So, to attempt to answer your question:
(1) it is wrong to use a pointer to the base class if you are trying to do stuff not defined in the base class;
(2) it is right to use a pointer to the base class if you are using polymorphism.
So the next question you need to address is this: can *all* SpaceShips fire lasers and missiles? (What about cargo ships?) If they can, then you can safely drop this stuff into SpaceShip and continue to use polymorphism. If they can't, but you could define a new subclass called ShipWithAttackyStuff from which all SpaceShips that can fire lasers and missiles can be derived, then you could use polymorphism at the level of ShipWithAttackyStuff (which might mean that you need to define something like isShipWithAttackyStuff() in the base class, so that you could then use pseudo-polymorphism when iterating over SpaceShips: call isShipWithAttackyStuff() then depending on the result call SpaceShip::Surrender() or cast the pointer to ShipWithAttackyStuff and polymorph from there.)
It's a lot of fun, this polymorphism. Especially when you get into multiple inheritance.