#include <stdio.h> #include <draw.h> #include <draw1.h> #include <draw2.h> #include <draw3.h> int main(int argc, char **argv) { obj_ofs *vdraw; /* et oui en C le typage des objets ne peut */ obj_ofs *vdraw1; /* pas etre verifie. */ obj_ofs *vdraw2; obj_ofs *vdraw3; vdraw = draw_new(); vdraw1 = draw1_new(); vdraw2 = draw2_new(); vdraw3 = draw3_new(); /* on accede a la methode display de la classe draw de l'objet vdraw */ call_draw_display(vdraw); /* on accede a la methode display de la classe draw de l'objet vdraw1 */ /* on utilise la meme fonction que si on avait on objet de la classe */ /* draw meme si vdraw1 n'est pas un objet draw mais il fait partie de */ /* la classe draw1 qui herite de la classe draw. Cette methode a ete */ /* surcharge par la classe draw1 mais nous on ne s'en soucie pas. */ call_draw_display(vdraw1); /* on accede a la methode display de la classe draw de l'objet vdraw2 */ /* on utilise la meme fonction que si on avait on objet de la classe */ /* draw meme si vdraw2 n'est pas un objet draw mais il fait partie de */ /* la classe draw2 qui herite de la classe draw. Cette methode a ete */ /* surcharge par la classe draw2 mais nous on ne s'en soucie pas. */ call_draw_display(vdraw2); /* on appele la methode fun1 de l'objet vdraw1 */ call_draw1_fun1(vdraw1); /* on appele la methode fun2 de l'objet vdraw2 */ call_draw2_fun2(vdraw2); /* on accede a la methode display de la classe draw de l'objet vdraw3 */ /* on utilise la meme fonction que si on avait on objet de la classe */ /* draw meme si vdraw3 n'est pas un objet draw mais il fait partie de */ /* la classe draw3 qui herite de la classe draw1 et draw2 qui herite */ /* de draw. La classe draw1 et la classe draw2 surcharge cette methode.*/ /* C'est un systeme de priorite qui resoud le probleme dans ces cas. */ /* Ici c'est la classe draw1 qui l'emporte. Si on avait voulu conserve */ /* la surcharge de la methode display par la classe draw2 on pouvait */ /* creer une nouvelle methode dans la classe draw3 qui recupere la */ /* surchage (c'est le renommage). Mais cela ne change rien au principe */ /* de la priorite, lorsque l'on considere un objet draw3 comme un draw */ /* on a acces qu'a une methode. */ call_draw_display(vdraw3); /* on appele la methode fun1 de l'objet vdraw3. Possible car l'objet */ /* vdraw3 appartient a la classe draw3 qui herite de draw1 */ call_draw1_fun1(vdraw3); /* on appele la methode fun2 de l'objet vdraw3. Possible car l'objet */ /* vdraw3 appartient a la classe draw3 qui herite de draw2. On voit */ /* bien que cela ne pose pas de probleme malgres l'heritage multiple */ /* de la classe draw3 (qui herite de draw1 et draw2). */ call_draw2_fun2(vdraw3); /* on appele la methode fun3 de l'objet vdraw3 */ call_draw3_fun3(vdraw3); return(0); }