Les classes abstraites : l'intérêt c'est que certaines méthodes ne sont pas implémentées mais elles imposent aux sous-classes concrètes de les implémenter.
L'interface c'est la même chose sauf qu'aucune méthode n'est implémentée et qu'il n'y a pas de variable non plus (attributs). En Java, contrairement aux classes abstraites, une classe peut implémenter plusieurs interfaces (alors qu'une classe ne peut descendre que d'une seule super classe... je crois que ce n'est pas le cas en C++ par contre).
Un exemple de classe abstraite que j'ai utilisée dans un projet : Shape. Elle a comme sous-classe Circle, Square et d'autres, qui ont plein d'opérations en commun mais qui sont souvent implémentées totalement différemment (par exemple, on ne dessine pas du tout un carré comme un cercle, on ne calcule pas son aire de la même façon, etc.) Pour autant, c'est utile d'avoir une superclasse abstraite, d'une part pour être sûr que Circle et Square respectent leur contrat de base (avoir une méthode pour les dessiner et une méthode pour calculer leur aire), et d'autre part parce que le fait d'avoir une superclasse est pratique si tu veux appliquer quelque chose à un objet Shape peu importe la forme spécifique (ça commence à devenir pratique quand tu as 100 différentes sous-classes, et tu ne vas pas t'amuser à faire des trucs du genre "if (object == (Object) Shape1 OR object == (Object) Shape2 OR ... OR object == (Object) Shape100

)
Les interfaces sont souvent utilisées pour des fonctionnalités moins spécifiques à une seule catégorie d'objets. Par exemple, en java, l'interface Comparable, qui permet de définir quand une instance d'une classe est plus grande qu'une autre, peut être utilisée par à peu près n'importe quel type d'objet (d'où l'intérêt que ce soit une interface), et est aussi très limitée

(typiquement une seule méthode) Utiliser une interface permet en particulier de l'appliquer à plusieurs classes sans s'emmêler les pinceaux (encore une fois, ça va t'*obliger* à implémenter certaines méthodes).