OO Languages can be used in place of low-level languages sometimes to interface directly with a machine. C++ For sure, but even for C# there are adapters and such. Though writing code to control mechanical parts and have minute control over memory are best kept as close to low-level as possible. But if this question is related to current Object-Oriented software like Line Of Business, web applications, IOT, Web Services, and the majority of mass used applications, then...
Answer, if applicable
Readers might try working with a Service-Oriented Architecture (SOA). That is, DDD, N-Layered, N-Tiered, Hexagonal, whatever. I haven't seen a Large business application efficiently use "Traditional" OO (Active-Record or Rich-Models) as it was described in the 70's and 80's very much in the last decade+. (See Note 1)
The fault isn't with the OP, but there are a couple problems with the question.
The example you provide is simply to demonstrate Polymorphism, it isn't production code. Sometimes examples exactly like that are taken literally.
In FP and SOA, Data is separated from Business Logic. That is, Data and Logic don't go together. Logic goes into Services, and Data (Domain Models) does not have Polymorphic behavior (See Note 2).
Services and Functions can be Polymorphic. In FP, you frequently pass functions as parameters to other functions instead of values. You can do the same in OO Languages with types like Callable or Func, but it doesn't run rampant (See Note 3). In FP and SOA, your Models aren't Polymorphic, only your Services/Functions. (See Note 4)
There is a bad case of hardcoding in that example. I'm not only talking about the red colored string "dog barks". I'm also talking about the CatModel and DogModel themselves. What happens when you want to add a Sheep? You have to go into your code and create new code? Why? In production code, I would rather see just an AnimalModel with its properties. At worst, an AmphibianModel and a FowlModel if their properties and handling are so different.
This is what I'd expect to see in a current "OO" Language:
public class Animal
{
public int AnimalID { get; set; }
public int LegCount { get; set; }
public string Name { get; set; }
public string WhatISay { get; set; }
}
public class AnimalService : IManageAnimals
{
private IPersistAnimals _animalRepo;
public AnimalService(IPersistAnimals animalRepo) { _animalRepo = animalRepo; }
public List<Animal> GetAnimals() => _animalRepo.GetAnimals();
public string WhatDoISay(Animal animal)
{
if (!string.IsNullOrWhiteSpace(animal.WhatISay))
return animal.WhatISay;
return _animalRepo.GetAnimalNoise(animal.AnimalID);
}
}

How do you move from Classes in OO to Functional Programming? As others have said; You can, but you don't really. The point of the above is to demonstrate that you shouldn't even be using Classes (in the traditional sense of the world) when doing Java and C#. Once you get to writing code in a Service-Oriented Architecture (DDD, Layered, Tiered, Hexagonal, whatever), you'll be one step closer to Functional because you separate your Data (Domain Models) From your Logical Functions (Services).
OO Language one step closer to FP
You might even take it a bit further and split your SOA Services into two types.
Optional Class Type 1: Common Interface-Implementing Services for Entry Points. These would be "impure" Entry-Points which can call into "Pure" or "Impure" other functionality. This might be your Entry Points from a RESTful API.
Optional Class Type 2: Pure Business Logic Services. These are Static Classes which have "Pure" functionality. In FP, "Pure" means there are no side effects. It doesn't explicitly set State or Persistence anywhere. (See Note 5)
So when you think of Classes in Object-Oriented Languages, being used in a Service-Oriented Architecture, it not only benefits your OO Code, it begins to make Functional Programming seem very easy to understand.
Notes
Note 1: Original "Rich" or "Active-Record" Object-Oriented Design is still around. There's a LOT of legacy code like that back when people were "doing it right" a decade or more ago. Last time I saw that kind of code (done correctly) was from an video game Codebase in C++ Where they were controlling memory precisely and had very limited space. Not to say FP and Service-Oriented Architectures are beasts and shouldn't consider hardware. But they place the ability to constantly change, be maintained, have variable data sizes, and other aspects as priority. In video games and machine AI, you control the signals and data very precisely.
Note 2: Domain Models do not have Polymorphic Behavior, nor do they have External Dependencies. They are "Isolated". That doesn't mean they have to be 100% Anemic. They can have a lot of logic related to their construction and mutable property alteration, if such applies. See DDD "Value Objects" and Entities by Eric Evans and Mark Seemann.
Note 3: Linq and Lambda's are very common. But when a user creates a new function, they rarely use Func or Callable as parameters, whereas in FP it would be weird to see an app without functions following that pattern.
Note 4: Not confusing Polymorphism with Inheritance. A CatModel might inherit AnimalBase to determine which Properties an Animal typically has. But as I show, Models like this are a Code Smell. If you see this pattern, you might consider breaking it down and turning it into data.
Note 5: Pure functions can (and do) accept functions as parameters. The incoming function might be impure, but might be pure. For testing purposes, it would always be pure. But in production, though it is treated as pure, it might contain side-effects. That doesn't change the fact that the pure function is pure. Though the parameter function might be impure. Not confusing! :D