(BTW I assume that Base and Parent are meant to be the same class)
I think you may have an
object slicing problem. The tree only has room for storing Parent instances. Any extra data that the Child has will be lost as there simply isn't any memory reserved for it in the tree.
Therefore I don't think a dynamic cast will work in a situation like this. It cannot convert it back to a Child instance, because it never stored a complete Child instance in the tree.
(I don't know if it still fails in this particular case because Child does not actually have any extra member variables or functions compared to Parent, but I am assuming this is just a toy example to illustrate the problem. Even if it isn't, it is probably still undefined behaviour to forcibly cast it back to Child.)
What you actually want to do is have a tree that stores pointers rather than whole objects, which allows the tree to indirectly store complete objects of various sizes (each derived type below Parent may have a different size, but pointers to them are all the same size), and allows a dynamic cast to work because it can retrieve the extra data. I'm sure the Boost library has various ways to more easily handle a tree or other collections with such indirect memory storage, but I haven't much experience with that.