C++ et Java: langages procéduraux objets. Python aussi, mais pas au point d'être fonctionnel OO comme l'était CLOS.
C++ et Java sont compilés, Python est interprété. Python est plus proche de l'"extreme late-binding of all things" d'Alan Kay. En effet, comme ruby, il va avoir (si je ne me plante pas dans le vocabulaire) des Open Classes (et object?), c'est à dire des classes où l'on peut rajouter, voire supplanter des fonctions déjà en place.
Les 3 sont des langages OO à classes et pas à prototypes.
L'encapsulation du Java est copiée du C++ : on encapsule (l'objectif de l'encapsulation est de protéger les invariants) en cachant des attributs et fonctions via les accessibilités public
, protected
, private
(et package
aussi). En Python, on cache/protège par convention de nommage. (En Eiffel, on a l'accès en lecture à tous les attributs, mais seuls les membres ont droit à l'écriture). Cacher, est plus proche du principe d'abstraction que d'encapsulation.
C++ et Python supportent l'héritage multiple. Java supporte l'héritage multiple d'interfaces – mais pas vraiment de contrats avant Java 8 vu que les interfaces ne pouvaient pas encore posséder de code et donc suivre le pattern NVI).
C++ dispose d'un héritage qui permet uniquement l'import de code (héritage privé). Java dispose d'un héritage qui ouvre uniquement au sous-typage (avec les interfaces) – initialement, l'héritage sert à importer du code, mais dans les langages OO mainstreams c'est le seul moyen de faire du sous-typage.
Etant dynamique, Python ne s'intéresse pas aux notions d'interfaces. On est dans un monde de Duck Typing et de polymorphisme paramétrique également) (en C++, on a le polymorphisme paramétrique (/et du Duck Typing) au niveau des templates, c'est la notion de concept qui remplace la notion d'interface). Python a d'ailleurs des notions de mixins/modules que l'on retrouve différemment en Ruby – je laisse d'autres rentrer plus dans les détails vu que je risque de dire des bêtises.
C++ et Java ne supportent pas le dispatch multiple sans sortir des tables de fonctions (ou équivalent) ou le pattern visiteur pour l'émuler. Le framework COS pour le C, et CLOS dont il est inspiré) supportent le dispatch multiple. Pour Python, je ne sais plus à quel point il est supporté. Avec le Duck Typing qui est de la partie, j'aurais tendance à dire que c'est supporté.
Après, il y a d'autres aspects qui permettent de distinguer/comparer ces langages (gestion des ressources en situation exceptionnelle, support des divers paradigmes (généricité, fonctionnel), richesse des bibliothèques, frameworks de tests, …
@Kje, GNU gcc a été réécrit/transformé en C++.
@Ez613, Java n'est pas 100% OO, Alan Kay (qui a posé le terme "OO") tend au contraire à dire que Java n'est pas OO (ni C++ d'ailleurs). Java force à employer le mot clé class
, ce qui donne une illusion de OO. Mais ce n'est qu'une illusion. Il y a beaucoup de code Java qui est Orienté Données, ou purement procédural qui tourne.