Lorsque vous surchargez une méthode virtuelle avec un spécificateur throw dans une classe dérivée, la méthode de la classe dérivée ne peut pas lever plus d'exceptions que la méthode de la superclasse. Si vous étiez autorisé à le faire, vous pourriez rompre le contrat créé par l'API publique de la superclasse en surchargeant des méthodes dans une sous-classe.
Dans votre exemple, vous dites que base::abc peut seulement lancer exp1. Cependant, si vous avez un pointeur de type base qui pointe en réalité vers une instance de sub, tout d'un coup abc peut lancer exp2 en plus de exp1.
Pour résoudre le problème, vous devez supprimer exp2 du spécificateur throw de la sous-classe ou ajouter exp2 au spécificateur throw de la super-classe.