The OO story generally falls apart once you go outside of the module/library, and want to actually treat objects like generic objects, and have new custom behaviour for some types of objects.
Either you end up with 'scary' enums, or with dynamic_cast and 'scary' null pointers.
Either you end up with 'scary' enums, or with dynamic_cast and 'scary' null pointers.