I know why it fails, but I don't know how to solve it.
first of all, should I be trying to do something like this? I have though of creating all the virtual functions needed in the parent class, but for the real code it would be a mess, since there are a lot of sub-classes and are quite different between them.
another way to solve it that I have tried is to cast a std::vector<Parent*> into std::vector<Son*> but the compiler says no in almost everything I try, is it possible to do it? and again should I be trying to do it?
any other thing that I could try to achieve my goal in a more elegant way?
There needs to be some sort of coherent design. It's hard for me to speak generally about this, because it really depends on the design.
Start from the ground up. What actual actions should a Parent object actually be able to do?
What is the end goal of having these Son and Son2 classes be derived from parent? What common functionality are you trying connect by having them all in a list?
Generally, yes, if you want some common, but dynamic functionality, you should have the base class have a virtual function, and then what that function actually does can be customized in the subclasses.
If they are doing completely different actions (say_hello, say_bye), perhaps you should store them separately and not in the same container.
Or, perhaps the base class should have a virtual function called "say", and Son1 says "hello", while Son2 says "bye" in their implementations.
_______________________________________________
As a last resort, you can cast individual objects from base class to derived class, but not the container (vector) itself.