Avec l'héritage multiple, il faudra éventuellement modifier la valeur du `` this'' premier argument de la fonction virtuelle.
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.
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)
).