Mécanisme de Vptr et Vtable en C++
En C++, au cours de dynamique de la liaison, considérons l'exemple suivant...
class Base
{
virtual void fun()
{
cout<<"Base";
}
};
class Derived : Base
{
void fun()
{
cout<<"Derived";
}
};
int main()
{
Base *bptr;
Derived d;
bptr=&d;
bptr->fun();
}
La sortie de la fonction ci-dessus est "Dérivé" en raison de la déclaration de mot clé virtual/de liaison dynamique.
Selon ma compréhension, une table virtuelle (Vtable) qui contient l'adresse de l'fonctions virtuelles. Dans ce cas, la table virtuelle créée pour la classe dérivée des points à l'héritage virtuel fun()
. Et bptr->fun()
va être résolu à bptr->vptr->fun();
. C'est le héritée de la classe de base de la fonction elle-même. Je ne suis pas complètement clair sur la façon dont la classe dérivée de la fonction est appelée?
notez qu'il est
Les réponses ci-dessous bonnes, mais si vous ressentez le besoin d'en lire plus sur le sujet, je vous recommande à l'Intérieur de l'Objet C++ (ISBN: 978-0201834543).
int main
, pas void main
, et les déclarations de classe, la fin avec un ;
.Les réponses ci-dessous bonnes, mais si vous ressentez le besoin d'en lire plus sur le sujet, je vous recommande à l'Intérieur de l'Objet C++ (ISBN: 978-0201834543).
OriginalL'auteur Blue Diamond | 2013-10-07
Vous devez vous connecter pour publier un commentaire.
Juste allé à travers ce lien table virtuelle et _vptr
Il est dit que le flux de travail va être comme ..
base_ptr->base_vptr----> pour vérifier l'accès de la fonction virtuelle dans la classe de base.
base_ptr->derived_vptr->virtual_function()---> pour appeler/appeler la fonction virtuelle.
Donc la classe dérivée de la fonction virtuelle est appelée.. Espérons que vous le trouverez utile.
base_ptr->derived_vptr->virtual_function()---> pour appeler/appeler la fonction virtuelle dans la classe dérivée.. de la classe de Base pointeur contient la dérivée virtuel pointeur(dérivée de la classe virtuelle d'un pointeur sur la classe dérivée de table virtuelle). Ensuite dérivé virtuel pointeur lors de l'appelle de la fonction virtuelle, la classe dérivée de la fonction virtuelle est appelée.
La dérivée de la fonction virtuelle ne doit pas être invoqué.. La classe dérivée de la fonction virtuelle est héritée de la classe de base.. remplacés fonction est censé être appelé...
OriginalL'auteur Santosh Sahu
Mal. Le
Derived
de l'instance vptr (un champ caché dans chaque cas) points à l'Derived
vtable.Ok, donc vous comprenez que chaque classe a ses propres vtable (qui dit de mise en œuvre qui doit être utilisé pour chaque méthode virtuelle) et chaque instance de vptr points pour le bon vtable, correspondant à l'objet réel (dynamique) de type. Ce qui est absent?
Peut-être le chaînon manquant, c'est que la Dérivée de la
fun
est aussi (implicitement) virtuel? C'est implicite, car les deuxfun
type signatures sont les mêmes.Vtable contient l'adresse de fonctions virtuelles. Mais comment la dérivée de la fonction sera appelée? La vtable ne contient pas l'adresse de la fonction non virtuelle..
Non-fonctions virtuelles sont évidemment choisi au moment de la compilation. Dans le code que vous avez présenté, la dérivée
fun
est aussi virtuel (implicitement), parce qu'il y a unvirtual fun
avec la même signature dans la classe de base. Changement de nom ou d'ajouter un paramètre, voir ce qui se passe.OriginalL'auteur Kos
La Norme ne spécifie pas le mécanisme par lequel le polymorphisme est mis en œuvre. Le dit est la façon dont il devrait fonctionner -- pas comment les éditeurs de compilateurs doivent la mettre en œuvre.
Cela étant dit, vous avez à peu près aussi loin que GCC sous Linux et MSVC sous Windows, et je m'attends à la plupart des autres compilateurs similaires.
Sens..Vtable contient l'adresse de fonctions virtuelles. Mais comment la dérivée de la fonction sera appelée? La vtable ne contient pas l'adresse de la non-fonctions virtuelles rit.. je voudrais obtenir cela clarifie...
OriginalL'auteur John Dibling