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