(0) Would love to answer all your questions ... but I can't think straight right now.
(1) Can't wrap my head around static polymorphism and runtime polymorphism.
Basically what I want to do is avoid adding all modules to all modules. I want an event bus to couple them more loosely.
(2) I still don't see how a function can be more powerful than a class.
(0) I guess trying out a couple of alternative, throwaway but concrete (compilable) solutions might be your best course of action, then.
(1) Go through this and try out the examples, that should do it: http://accu.org/index.php/journals/538
Note that static forms of polymorphism (both parametric/templates and overloading) are somewhat more powerful in C++ than dynamic polymorphism (in form of inclusion polymorphism/inheritance), since they support multiple dispatch out-of-the-box (so there's no need for things like the visitor pattern in Java if you're fine with the compile-time world), see: http://www.codeproject.com/Articles/635264/Open-Multi-Methods-for-Cplusplus11-Part-1
To see how this comes up in game development, consider the asteroids-spaceships collisions example:
https://en.wikipedia.org/wiki/Multiple_dispatch#Examples
// Note that if you need dynamic/run-time polymorphism, you will also need to use something like the visitor pattern (or a library-based solution), even in C++.
(2) Things like std::function support type-erasure and directly support catamorphisms (again, completely eliminate the need for design patterns like the visitor pattern), so a lot of the things you'd normally need a lot of OOP boilerplate for (to implement the design patterns) are simply supported out of the box (no manually written boilerplate code) if you write in FP style:
http://lorgonblog.wordpress.com/2008/04/09/catamorphisms-part-three/
http://stackoverflow.com/questions/2527153/are-design-patterns-specific-to-language-or-technology
In particular, in OOP style you often have to waste your time coding some brittle/rigid boilerplate requiring inheritance, while in FP style with std::function you can completely decouple many of your components. Here's another example in the gamedev context: http://probablydance.com/2012/12/16/the-importance-of-stdfunction/
Consider the traditional (OOP/inheritance solution):
But you’ve got that inheritance in there, and that doesn’t scale. You will probably want to add a render loop and maybe a separate update loop for the editor. Once you’ve got that many base classes it makes sense to combine them into one. And now you’ve just started on the way of having a big base class that gets used everywhere. Soon enough adding something different to the update loop involves a whole lot of unnecessary work.
And compare with the FP one:
This has no inheritance. Meaning I can add anything to the update loop now. If I create a new object that is unrelated to anything I had before and is managed completely differently, I can still add it just as easily as anything else. And I can use the same idea for a render loop or for implementing an observer pattern. It makes everything immensely easier.
Perhaps this is exactly what you're looking for?
Just as with anything in programming, there ain't no such thing as a free lunch, so each solution has upsides and downsides -- it's your wonderful job as a designer to compare and contrast each and chose the least-imperfect one for the task at hand :-)
In particular, both std::function and OOP/inheritance will have a run-time cost related to type-erasure/virtual function call; in contrast, if it's possible for you to know the types at compile-time and you can design & code a GP solution with templates, you won't suffer any overhead of this type (although may have icache trade-offs to consider, etc.).