next up previous contents
Next: Liaison dynamique et héritage Up: La liaison dynamique Previous: Liaison dynamique et héritage

Liaison dynamique et héritage multiple

Avec l'héritage multiple, il faudra éventuellement modifier la valeur du `` this'' premier argument de la fonction virtuelle.

tabular1147

Si on a :

C* pc = new C;
B* pb = pc;
A* pa = pc;
Dans tous les cas, un appel pa->f(), pb->f() ou pc->f() provoquera un appel de C::f(), cependant, dans la représentation choisie ici, l'adresse de pb ne correspond pas au début d'une zone pour un objet C. Il faudra donc faire un déplacement du ``this'' au moment de l'appel. Les entrées de du tableau vtbl seront des structures avec deux membres, le premier étant le pointeur sur fonction, le deuxième étant le déplacement à opérer sur l'adresse this au moment de l'appel.

picture1206

La structure des entrées de vtbl est :

struct vtbl_entry{
    void (*fct)();
    int delta;
};
Et l'appel pb->f() correspondra à :
vtbl_entry *ve = & pb->vtbl[0];  // f premier element du tableau
(*ve->fct)((B *)((char *)(pb+ve->delta)));
On vérifie aisément que tout se passe comme prévu ; l'affectation pb = pc consiste simplement à faire pointer pb sur le début de la zone de la partie B (c'est-à-dire faire pb =(char *)pc + delta(B)).


Mon Oct 20 14:02:48 MET 1997