6
votes

Comment fonctionne l'invocation de la méthode virtuelle en C ++?

Comment Invocation de méthode virtuelle travaille en C ++?


3 commentaires

Hein? Vous voulez dire appeler une méthode virtuelle? C'est la même chose que d'appeler un régulier. Rendre votre question plus précise.


in c ++ L'invocation est effectuée, comme l'invocation d'une méthode normale objet.foo (); laissez-moi deviner. Vous posez des questions sur la mise en œuvre?


La mise en œuvre des méthodes virtuelles n'est pas définie afin que la question n'a pas de sens. En tant que note latérale, sachant que la réponse hors contexte sans expérience ne vous aidera de quelque manière que ce soit (à moins que vous ne souhaitiez construire un compilateur puis vous ne poseriez pas la question de toute façon).


4 Réponses :


8
votes

via des tables virtuelles.

Lire cet article, http://en.wikipedia.org/wiki/virtual_table .

Je pourrais l'expliquer ici, mais la Wikipedia fait un meilleur travail que possible.


2 commentaires

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 utiles à beaucoup de choses que celles-ci sont dangereuses. La section sur l'efficacité est carrément trompeuse et le papier qu'il lie à partir de 1996 (c'est-à-dire de plus d'une décennie et à partir de l'époque de GCC 2.96 (ce qui n'est même pas considéré comme un compilateur C ++ travaillant, sans parler d'un compilateur C ++ moderne)). La section sur les alternatives est bonne pour une discussion relative de l'envoi virtuel, mais absolument non s'applique à C ++ (ce qui n'est pas évident pour un débutant).


Plus de 2 décennies maintenant



0
votes

Chaque classe avec au moins une méthode virtuelle a sa table virtuelle - Tableau des pointeurs à fonctionner les méthodes de la classe.

Il est largement utilisé dans COM.


1 commentaires

Chaque classe n'a pas de table virtuelle. Tout d'abord, seule la classe polymorphe aurait une machine à installer, et le second de tous les ordinateurs virtuels sont spécifiques à la mise en œuvre. La norme indique simplement que "tu travailles", cela ne dit pas comment, et les vtables sont comment.



5
votes

La norme C ++ ne spécifie pas la manière dont le mécanisme de fonction virtuelle doit être mis en œuvre.

Cela dit, je pense que tous les compilateurs C ++ actuels utilisent des tables virtuelles.
Le moyen courant de le faire pour les classes contenant au moins une fonction virtuelle pour avoir un pointeur caché à une table dits virtuelle, où les adresses des fonctions virtuelles pour une classe spécifique sont entrées dans l'ordre spécifique du compilateur.
Chaque constructeur définira alors ce pointeur caché sur la table virtuelle de la classe auquel il appartient.


7 commentaires

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 dans le temps d'exécution et la taille binaire), voir par exemple: groups.csail.mit.edu/pag/paste2005/slides/... Ce n'est pas très détaillé mais il n'y a pas de graphiques cool À la fin, ce qui montre que la table virtuelle est la méthode la moins efficace de celles comparées.


Convenez que VT est le simpliste (une des raisons pour lesquelles il est le plus utilisé). Mais ces graphiques (WOW), les lignes sont moyennes à plat, il y a quelque chose de funky là-bas. De plus, la ligne "Les petits programmes sont générées par un script" sert un peu. J'aurais aimé voir des programmes réels mondiaux mis en œuvre dans les trois langues. Les différents types de programmes vont également avoir des caractéristiques différentes.


@Matthieu: Wow, j'ai appris quelque chose de nouveau! Merci, j'ai adapté ma réponse en conséquence. J'espère que ça va maintenant?


@Martin: J'aimerais certainement voir cela au travail aussi. Cependant, il est agréable que ces alternatives soient considérées. Je pense que le problème principal rencontré par l'approche est avec une multi-héritage, j'aimerais voir de tels graphiques dans le cas plus commun de simple héritage, où le vtable L'approche semble très optimale.


@Matthieu: Oui, je pense que nous pouvons convenir que tout est bon travail. Nous avons juste besoin de plus d'informations.


@Martin: Apparemment, il semble que la principale caractéristique est la table de couleur, j'ai trouvé un papier sur l'ACM lié à ceci: Portal.acm.org/... Cependant, je n'ai pas de compte ACM. L'idée est d'obtenir une seule table virtuelle même lorsque MI est impliqué. Je ne comprends toujours pas comment cela est possible sans une analyse de programme entière.


@Martin: J'ai trouvé un autre document (enfin) qui décrit plusieurs manières de la mise en œuvre de l'expédition (multiple) -> lirmm.fr/~ducour/dea/papiers02/OPSLA%2702-DISPATCHING-TS.PD F (Chapitre 2).



0
votes

avec vtables et pointeurs de fonction. Le pointeur de fonction des fonctions virtuelles sera répertorié dans Table-livable
MFC utilise une carte de message au lieu de la fonction virtuelle, ce qui réduit la limitation de la taille. Si nous utilisons plusieurs fabricants virtuels, il se retrouvera avec une grande taille.


0 commentaires