Допустим есть класс IF. Он умеет создавать IA и IB. (то что с префиксом I это интерфейс). Конкретные классы это F, A, B соответственно.
Еще в IF есть какой-то метод foo(IA *a). Внутри он преобразуется static_cast-ом в A и у него вызывается какой-то метод. Этого метода нет в интерфейсе IA, он намеренно скрыт и используется только внутри класса F в реализации.
Суть вопроса. static_cast в данном контексте зло, т.к. программист может определить класс AA, который наследует интерфейс IA, получается когда мы у IF вызовем foo и подсунем ему этот левый класс, то static_cast с-фэйлится. Как лучше всего избежать такой ситуации? Хранить enum с типом как то не хочется.