- Use arbitrary information to describe a class
- Instantiate a class
- Call its methods by arbitrary identifiers (although you can use strings to identify methods, it is possible to use any arbitrary information to select them)
- Fast function calls - you only have the overhead of two functions called by function pointers.
- Call functions without knowing what parameters they require.
- Containers indexed by type.