2 votes

mots-clés virtuels internes

J'ai souvent entendu dire que les fonctions virtuelles sont généralement implémentées en utilisant une table virtuelle. Mais je ne sais pas vraiment comment elle est mise en œuvre et comment elle fonctionne.

modifier

Je n'ai pas vraiment eu ce code : Comment le réécrire. Quelqu'un peut-il l'expliquer en détail, s'il vous plaît ?

Enfin, voyons comment le compilateur implémente un appel à une fonction virtuelle. Votre code pourrait ressembler à ceci :

 // Your original C++ code

 void mycode(Base* p)
 {
   p->virt3();
 }

Le compilateur n'a aucune idée si cela va appeler Base::virt3() o Der::virt3() ou peut-être le virt3() d'une autre classe dérivée qui n'existe même pas encore. Il sait seulement avec certitude que vous appelez virt3() qui se trouve être la fonction dans le slot #3 de la table V. Il réécrit cet appel en quelque chose comme ceci :

 // Pseudo-code that the compiler generates from your C++

 void mycode(Base* p)
 {
   p->__vptr[3](p);
 }

4voto

user225312 Points 22699

L'explication de la Internes des fonctions virtuelles sur la FAQ C++ est assez bon. Vous devriez le lire. Je pense qu'il serait préférable que vous essayiez de le comprendre vous-même et que vous posiez ensuite vos questions.

0voto

EboMike Points 39257

L'implémentation commune est d'avoir un pointeur au début de chaque instance d'un objet qui pointe vers une vtable. Il y a une vtable par classe, donc si vous avez une classe A et une classe B, il y aura une table pour chacune.

La vtable contient essentiellement un tas de pointeurs de fonctions, donc si la classe A a deux fonctions virtuelles, foo() et bar(), la table aura des pointeurs vers les deux. Si la classe B surcharge ces deux fonctions, elle aura ses versions de foo() et bar() aux mêmes décalages.

0voto

doron Points 10296

Une façon simple de comprendre le fonctionnement des vtables est d'implémenter le même type de fonctionnalité en C en utilisant des pointeurs de fonction, car une vtable n'est rien d'autre qu'un tableau de pointeurs de fonction vers les implémentations concrètes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X