Comment la table d'adressage d'une sous-classe étend-elle celle de la super-classe ?
Savoir construire la vtable d'une sous-classe en tenant compte des méthodes héritées, redéfinies et nouvelles.
Savoir construire la vtable d'une sous-classe en tenant compte des méthodes héritées, redéfinies et nouvelles.
La vtable d'une sous-classe est construite en 3 règles : (1) conserver les mêmes offsets pour les méthodes héritées ou redéfinies ; (2) pour les redéfinies, pointer vers le nouveau code ; (3) ajouter les nouvelles méthodes après. Ceci garantit que le code d'appel p FETCH(0) READ PUSH(num) CREAD fonctionne identiquement pour tous les objets d'une hiérarchie.
num(SousClasse, m) = num(SuperClasse, m) pour toute méthode m présente dans la super-classe.vtable[num] = adr(SousClasse, m) (différent de adr(SuperClasse, m)).vtable[num] = adr(SuperClasse, m).Construire la vtable de ColorPoint extends Point qui redéfinit d() et ajoute color().
num(SousClasse, m) = num(SuperClasse, m) pour toute méthode m présente dans la super-classe.vtable de Point (référence) : s() en 0, d() en 1.
// vtable Point = [adr(Point,s), adr(Point,d)]
// num(Point,s)=0, num(Point,d)=1
class Point { int x,y; int s(){return x+y;} int d(){return x*x+y*y;} }
vtable[num] = adr(SousClasse, m) (différent de adr(SuperClasse, m)).ColorPoint redéfinit d() → offset 1 pointe vers le nouveau code.
class ColorPoint extends Point {
String color;
@Override int d() { return 3*x+y*y+1; } // redéfinie
String color() { return color; } // nouvelle
}
// num(ColorPoint,s) = 0 (conservé)
// num(ColorPoint,d) = 1 (conservé, mais nouveau code)
// num(ColorPoint,color) = 2 (nouvelle)
vtable[num] = adr(SuperClasse, m).s() n'est pas redéfinie → même adresse de code que Point.
// vtable ColorPoint :
// [0] = adr(Point,s) ← non redéfinie
// [1] = adr(ColorPoint,d) ← redéfinie
// [2] = adr(ColorPoint,color) ← nouvelle
Vérifier que le code d'appel p.d() fonctionne pour Point et ColorPoint sans modification.
// Appel p.d() compilé : p FETCH(0) READ PUSH(1) CREAD GSB POP PRX
// Si p est Point : vtable[1] = adr(Point,d) → x²+y²
// Si p est ColorPoint : vtable[1] = adr(ColorPoint,d) → 3x+y²+1
// Même code d'appel, comportement différent : liaison dynamique !
Point p1 = new Point(); p1.x=2; p1.y=3;
Point p2 = new ColorPoint(); ((ColorPoint)p2).x=2; ((ColorPoint)p2).y=3;
System.out.println(p1.d()); // 4+9 = 13
System.out.println(p2.d()); // 6+9+1 = 16 (méthode ColorPoint)
vtable ColorPoint = [adr(Point,s), adr(ColorPoint,d), adr(ColorPoint,color)] : positions 0 et 1 conservées, code de d() mis à jour.
Construire la vtable d'Essence extends Voiture extends Vehicule à 3 niveaux avec une méthode redéfinie à chaque niveau.
Crée ton compte gratuit pour accéder à la fiche et aux exercices