#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);
}