LSP требует, чтобы подкласс поддерживал контракт своего суперкласса.
Это подразумевает 4 правила, которые вы упоминаете о параметрах и типах возвращаемых данных, но контракт может также включать много вещейэто не фиксируется в коде (хотя было бы неплохо, если бы оно было зафиксировано в комментариях!).
Других требований нет, поэтому, если в контракте Animal
нет правила, в котором это указанодолжны есть только общую пищу, тогда ваше переопределение в порядке.Если является таким правилом, то не стоит делать метод eat
виртуальным.