So, my concrete use for it:
I’ve got a large C++ project that is basically WebAudio for desktop. It works by building a directed acyclic dependency graph of node base classes, each base class holding shared data like the dependencies of the node and some pre-allocated buffers. The base handles connection information like channel layouts, holding a mapping of integer keys to property instances, etc. Then, each derived node type comes in, provides a creator function, subclasses, and puts whatever data in it needs to have.
With specialization and fields in traits, this would be translatable to Rust, for the most part; without them, the things you have to do to make it work are decidedly not fun. Even with specialization and fields in traits (assuming fields in traits gets approved), you still can’t just say “here is my base object, I want to override this one method”. Instead, you have to jump through annoying hoops to set up a trait that contains the base field and implement it.
The logic in this project that allows it to integrate with Python’s GC then uses Any. I don’t think Any's differences from dynamic_cast are restricting in this case, though I’d need to read the extremely complicated GC integration thing I did to see if that’s true.
This is a pattern I see a lot with graphs. You want some sort of uniform interface with some sort of default implementation and some bookkeeping that’s done automatically, then you want to override the methods that actually do type-specific things.
I don’t believe in multiple inheritance, but single inheritance like this is an incredibly useful thing to have even in situations that aren’t OOP. Moreso if you can somehow bring in selected trait implementations of the base that you know are going to be correct because you don’t break their invariants.