Toutes les langues ne devraient pas essayer d'intégrer toutes les caractéristiques de toutes les autres langues.
Le C++ est essentiellement un macro-assembleur très, très sophistiqué. Ce n'est PAS (au sens traditionnel du terme) un langage de haut niveau comme C#, Java, Objective-C, Smalltalk, etc.
Il est bon d'avoir différents outils pour différents travaux. Si nous n'avons que des marteaux, tout ressemblera à des clous, etc. Avoir des langages script est utile pour certaines tâches, et des langages OO réfléchis (Java, Obj-C, C#) sont utiles pour une autre catégorie de tâches, et des langages super efficaces proches de la machine sont utiles pour une autre catégorie de tâches (C++, C, Assembler).
Le C++ fait un travail remarquable en étendant la technologie Assembler à des niveaux incroyables de gestion de la complexité et d'abstractions pour rendre la programmation de tâches plus vastes et plus complexes beaucoup plus possible pour les êtres humains. Mais ce n'est pas nécessairement un langage qui convient le mieux à ceux qui abordent leur problème d'un point de vue strictement de haut niveau (Lisp, Smalltalk, Java, C#). Si vous avez besoin d'un langage doté de ces caractéristiques pour mettre en œuvre au mieux une solution à vos problèmes, remerciez ceux qui ont créé de tels langages pour que nous puissions tous les utiliser !
Mais le C++ est destiné à ceux qui, pour quelque raison que ce soit, ont besoin d'une forte corrélation entre leur code et le fonctionnement de la machine sous-jacente. Qu'il s'agisse d'efficacité, de programmation de pilotes de périphériques, d'interaction avec les services de bas niveau du système d'exploitation ou autre, le C++ est mieux adapté à ces tâches.
C#, Java, Objective-C nécessitent tous un système d'exécution beaucoup plus vaste et plus riche pour soutenir leur exécution. Ce système d'exécution doit être livré au système en question - préinstallé pour soutenir le fonctionnement de votre logiciel. Et cette couche doit être maintenue pour différents systèmes cibles, personnalisée par QUELQUE AUTRE LANGUE pour qu'elle fonctionne sur cette plateforme. Et cette couche intermédiaire - cette couche adaptative entre le système d'exploitation hôte et votre code - le temps d'exécution, est presque toujours écrite dans un langage comme le C ou le C++ où l'efficacité est au premier plan, où la compréhension prévisible de l'interaction exacte entre le logiciel et le matériel peut être bien comprise, et manipulée pour un gain maximal.
J'aime Smalltalk, Objective-C, et avoir un système d'exécution riche avec la réflexion, les méta-données, le ramassage des ordures, etc. Il est possible d'écrire des codes étonnants pour tirer parti de ces facilités ! Mais il s'agit simplement d'une couche supérieure sur la pile, une couche qui doit reposer sur des couches inférieures, qui elles-mêmes doivent en fin de compte reposer sur le système d'exploitation et le matériel. Et nous aurons toujours besoin d'un langage qui soit le mieux adapté à la construction de cette couche : C++/C/Assembleur.
Addendum : C++11/14 continue d'étendre la capacité du C++ à prendre en charge des abstractions et des systèmes de plus haut niveau. Le threading, la synchronisation, des modèles de mémoire précis, des définitions de machines abstraites plus précises permettent aux développeurs C++ de réaliser de nombreuses abstractions de haut niveau que certains de ces langages de haut niveau seulement avaient l'exclusivité, tout en continuant à fournir des performances proches du métal et une excellente prévisibilité (c'est-à-dire des sous-systèmes d'exécution minimaux). Peut-être que les fonctions de réflexion seront activées de manière sélective dans une future révision du C++, pour ceux qui le souhaitent - ou peut-être qu'une bibliothèque fournira de tels services d'exécution (il y en a peut-être déjà une, ou les prémices d'une dans boost ?)