Using a FeatureLayer cuts down on the amount of code you would write, simply by setting its mode or setting a definition expression. Moreover, like you said, the symbology comes through.
A query layer is useful when you want to get a set of records back based on a where clause or by geometry. You could use a geometry as an input to query a layer.
I would compare the QueryTask with IdentifyTask since they are more similar. The IdentifyTask does not allow you to pick which fields to output, but you can select the layers you would like to identify.