Once you are in the blueprint world you are pretty much stuck in it. In general I tend to do as much as I can in C++ and only do the last step in blueprints. So all the base classes, everything that could be abstract, are a good candidate for C++. Then I create BP classes out of that which defines data like the actual used meshes, tags and so on. I add class specific components like audio components or additional meshes that are not being used in the base classes. Also I often bind to dispatchers of my used components here. I rarely have any abstract BP classes or a more than 2 levels deep blueprint inheritance. In my opinion there’s no real need for a “every BP class should have a C++ parent” rule.