This would break LSP. E.g.
baseptr->func(baseobjectptr);
If baseptr points to your derived object (where func expects a
derivedobjectptr), then what is meant to happen? A crash? An
exception? In any case, a runtime check is required.
Allow me to expand a bit on that, because it's not the whole story.
Consider first why function results can be covariant. It is because
they are pure 'out' when regarded as parameters. Similarly, without
breaking the Liskov Substitution Principle, pure 'in' parameters can
in principle be contravariant. A parameter that is both 'in' and
'out' cannot be variant at all within the constraints of the LSP.
The problem is that C++ only partially supports the notion of 'in' and
'out'. Specifically, there's no way -- as far as I know -- to tell
the compiler that a parameter is strictly 'out'. Hence, from the C++
compiler's point of view a parameter that is intended as pure 'out'
appears as 'in'+'out', and so cannot be variant.
Ada does support 'in' and 'out' specifications, but strangely it seems it
wasn't considered when partial support for object-based programming was
added to that language (this problem area also seems to have been
overlooked in Ada's notion of initializers).
C# (but not Java) also supports 'in' and 'out', but again, strangely, that
isn't taken advantage of -- as far as I can read the specification.