Когда вы переопределяете виртуальный метод с помощью спецификатора throw в производном классе, метод в производном классе не может выбросить больше исключений, чем метод в суперклассе.Если вам было разрешено это сделать, вы могли бы разорвать контракт, созданный публичным API суперкласса, переопределив методы в подклассе.
В вашем примере вы говорите, что base :: abc может генерировать только exp1.Однако, если у вас есть указатель типа base, который действительно указывает на экземпляр sub, неожиданно abc может выдать exp2 в дополнение к exp1.
Чтобы устранить проблему, необходимо удалить exp2 изспецификатор throw в подклассе или добавление exp2 к спецификатору throw суперкласса.