Comment l'appel de méthode virtuelle fonctionne en C++?Comment l'appel de méthode virtuelle fonctionne-t-il en C++?
Répondre
Via des tables virtuelles.
Lire cet article, http://en.wikipedia.org/wiki/Virtual_table.
Je pourrais l'expliquer ici, mais le wikipedia fait un meilleur travail que je pourrais.
Après avoir lu cette page, je pense que c'est horrible pour les débutants. Il ne contient pas assez d'informations pour être utile encore à beaucoup que cela soit dangereux. La section sur l'efficacité est carrément trompeuse et le document auquel elle renvoie est de 1996 (plus de dix ans et à partir de gcc 2.96 (ce n'est même pas considéré comme un compilateur C++ et encore moins un compilateur C++)). La section sur les alternatives est bonne pour une discussion relative à la répartition virtuelle, ** MAIS ** absolument non s'applique à C++ (ce qui n'est pas évident pour un débutant). –
Chaque classe avec au moins une méthode virtuelle a sa table de table virtuelle de pointeurs vers des fonctions qui sont les méthodes de cette classe.
Il est largement utilisé dans COM.
Chaque classe n'a PAS de table virtuelle. Tout d'abord, seule une classe polymorphe aurait un vtable, et deuxièmement, les vtables sont spécifiques à l'implémentation. La norme dit simplement "tu travailleras", elle ne dit pas comment, et les vtables sont comment. –
La norme C++ ne spécifie pas comment le mécanisme de fonction virtuelle doit être implémenté. Cela dit, je pense que tous les compilateurs C++ actuels utilisent des tables virtuelles.
La manière courante de faire cela pour les classes qui contiennent au moins une fonction virtuelle pour avoir un pointeur caché vers une table dite virtuelle, où les adresses des fonctions virtuelles pour une classe spécifique sont entrées dans l'ordre spécifique au compilateur.
Chaque constructeur mettra ensuite ce pointeur caché à la table virtuelle de la classe à laquelle il appartient.
En fait, la table virtuelle est la méthode la plus simple, mais d'autres ont été essayées et rapportées comme étant plus efficaces (à la fois en temps d'exécution et en taille binaire), voir par exemple: http://groups.csail.mit.edu/pag/paste2005 /slides/privat-paste2005-slides.pdf ce n'est pas très détaillé mais il y a des graphiques sympas à la fin qui montrent que la table virtuelle est la méthode la moins efficace de ceux comparés. –
D'accord que VT est le simpliste (l'une des raisons pour laquelle il est le plus largement utilisé). Mais ces graphiques (wow), les lignes sont à plat, il y a quelque chose de génial qui s'y passe. De plus, la ligne "Les petits programmes sont générés par un script" dépasse un peu. J'aurais aimé voir des programmes concrets dans les trois langues. Différents types de programmes vont également avoir des caractéristiques différentes. –
@Matthieu: Wow, j'ai appris quelque chose de nouveau à nouveau! Merci, j'ai adapté ma réponse en conséquence. J'espère que ça va maintenant? – sbi
Avec VTables et pointeurs de fonction. Le pointeur de fonction des fonctions virtuelles sera répertorié dans VTable
MFC utilise Message Map au lieu de la fonction Virtual, ce qui réduit la limitation de taille. Si nous utilisons plusieurs fonctions virtuelles, VTable se retrouvera avec une grande taille.
Eh? Vous voulez dire appeler une méthode virtuelle? C'est la même chose que d'appeler un habitué. Rendez votre question plus spécifique. –
** En C++ ** l'invocation est faite comme l'invocation d'une méthode normale 'object.foo();' Laisse-moi deviner. Vous demandez à propos de la mise en œuvre? –
L'implémentation de méthodes virtuelles n'est pas définie, donc la question n'a pas de sens. En guise de remarque, connaître la réponse hors contexte sans expérience ne vous aidera en rien (à moins que vous ne vouliez construire un compilateur et que vous ne poseriez pas la question de toute façon). –