En discutant d' une question sur les fonctions virtuelles sur Stack Overflow, je me suis demandé s'il y avait une dénomination officielle pour les fonctions virtuelles pures (abstraites) et non pures.
J'ai toujours compté sur wikipedia pour mes informations, qui stipule que les fonctions virtuelles pures et non pures sont le terme général. Malheureusement, l'article ne le sauvegarde pas avec une origine ou des références.
Pour citer la réponse de Jon Skeet à ma réponse que pur et non pur sont le terme général utilisé:
@Steven: Hmm ... peut-être, mais je ne l'ai jamais vu dans le contexte de C ++ auparavant. Je soupçonne que quiconque en parle est susceptible d'avoir une formation en C ++ :)
Les termes provenaient-ils du C ++, ou ont-ils été définis ou mis en œuvre pour la première fois dans un langage antérieur, et s'agit-il des termes scientifiques «officiels»?
MISE À JOUR:
Frank Shearar a utilement fourni un lien vers la description du langage de base commun SIMULA 67 (1970). Ce langage semble être le premier langage à introduire des mots-clés OO comme classe , objet , et aussi virtuel comme concept formel. Il ne définit pas pur / non pur ou abstrait , mais il prend en charge les concepts .
Qui les a définis?
la source
Réponses:
Nygaard et Dahl ont utilisé le terme pour la première fois, dans SIMULA 67 Common Base Language . Regardez dans la section 2.1, par exemple, et la section 2.2.3. (Pour autant que je sache au moins. Mais bon, en ce qui concerne les POO, c'est probablement la première utilisation du terme.)
la source
Alors ... j'ai fait un peu de recherche. Ce qui suit est une petite leçon d'histoire pour les personnes intéressées. :) Passez à la conclusion en bas si vous êtes uniquement intéressé par la réponse.
1967 :
SIMULA 67 , le premier langage de programmation orienté objet définit les mots clés comme classe , objet , appel par référence , appel par valeur et virtuel .
Le système d' héritage de SIMULA était à l'origine connu sous un nom différent, concaténation (et plus tard connu sous le nom de préfixe ), se référant au fait que le code des supertypes était copié et `` concaténé '' avec le code des sous-types. Plus tard, une autre forme de système d'héritage a émergé, la délégation , où les appels sont délégués par référence au type correct.
Virtuel se réfère très probablement au processus qui doit être effectué pour envoyer un appel à l'implémentation correcte en utilisant une table de méthode virtuelle . Il est virtuel par rapport à une implémentation fixe / concrète.
1971 :
Niklaus Wirth, écrit sur un concept défini comme le raffinement par étapes . Il explique en gros comment diviser un programme en solutions partielles sur lesquelles il est possible d'étendre.
1974 :
C'est le premier article que j'ai trouvé qui invente le terme types de données abstraits par Barbara Liskov .
Cet article définit également un cluster d'opérations qui semble spécifier ce que nous connaissons maintenant comme une interface .
Terminologie scientifique intéressante (article de 1996):
Héritage : un mécanisme de bas niveau par lequel des objets ou des classes peuvent partager un comportement ou des données.
Sous - typage : exprime la spécialisation conceptuelle. Une forme spécifique d'héritage, également appelée héritage d'interface .
Principes d'abstraction : Processus d'organisation de notre connaissance d'un domaine d'application en classements hiérarchiques d'ordonnances d'abstractions, afin d'obtenir une meilleure compréhension des phénomènes concernés.
Abstractions partiellement implémentées : abstractions dont les définitions ont délibérément été laissées incomplètes.
Classes abstraites : terme spécifique pour une classe partiellement implémentée dans les systèmes orientés objet.
Héritage sans restriction : permet de redéfinir (ou même de supprimer) les opérations dans les sous-classes.
Héritage strict : héritage compatible avec le comportement.
Conclusion :
La classe abstraite est le terme le plus général à utiliser dans les systèmes orientés objet. Il semble que les fonctions virtuelles pures et non pures ne proviennent que de C ++. Par exemple, cette interview avec Stroustrup donne l'impression qu'il a inventé les termes. Les articles scientifiques utilisent une terminologie plus générale.
Le virtuel provient de SIMULA, ce qui fait que son utilisation est répandue, mais ce n'est pas un terme général. Il définit déjà les détails d'implémentation. Parler en termes de types d'héritage est plus approprié. Non virtuel par défaut correspond à un héritage strict par défaut, tandis que virtuel par défaut correspond à un héritage non strict .
Toute personne intéressée à ajuster l' entrée wikipedia ? :)
la source
En C ++, les fonctions membres qui sont liées dynamiquement et qui peuvent donc être remplacées par une sous-classe sont appelées "virtuelles". Les fonctions virtuelles qui doivent impérativement être remplacées sont appelées «virtuelles pures». Notez qu'une fonction virtuelle pure peut avoir un corps, bien que ce ne soit souvent pas le cas. Une classe qui a au moins une fonction virtuelle pure est appelée "abstraite" et ne peut pas être instanciée, uniquement dérivée de.
Je suppose que la raison pour laquelle les fonctions virtuelles sont appelées virtuelles est le fait qu'on ne sait pas quelle fonction réelle sera appelée au moment de la compilation. Dans un sens, un appel de fonction virtuelle "n'existe pas" au moment de la compilation.
Je suppose également que la raison pour laquelle le terme "abstrait" est utilisé pour une classe avec une fonction virtuelle pure est que vous ne pouvez pas avoir d'objets de cette classe. En un sens, c'est un concept abstrait très éloigné du monde concret des objets.
Edit: Autres langues.
En ce qui concerne la question de savoir comment le terme «virtuel» est général, voici mes deux cents. Dans Smalltalk, toutes les fonctions utilisent une liaison dynamique, donc elles sont toutes virtuelles, et il n'y a pas besoin de terme spécial ou de mot clé de langue. En Java, si je ne me trompe pas, le compilateur décide automatiquement si la liaison dynamique doit être utilisée, en ce qui concerne le programmeur il n'y a pas de distinction, et donc pas de mot-clé "virtuel".
En C ++, la distinction entre virtuel et non virtuel est nécessaire, car c'est au programmeur de décider quand la liaison dynamique doit être utilisée pour économiser sur la surcharge lorsqu'elle n'est pas nécessaire.
la source
dynamic
- qui est une sorte de méthode virtuelle qui échange de l'espace contre du temps: elles prennent moins de place et sont plus lentes à exécuter que lesvirtual
méthodes.