[Résolu] Héritage de pointeur

Bonjour à toutes et à tous,

Dans le programme qui suit, j’ai deux classes, le Parent et l’Enfant… Chacune d’elle posséde une méthode que je ne sais pas nommer, c’est :

void (* surAppel)(String);

Si j’affecte une fonction au pointeur “surAppel”, je peux appeler cette fonction à partir d’une autre classe par exemple (le but est d’attacher une méthode spécifique à un évènement). Le problème est que cela ne fonctionne qu’avec la classe parent, pas avec la classe enfant. Apparemment, je ne peux pas rendre virtuelle cette fonction. Comment faire pour que cela fonctionne avec la classe enfant ? Voici le code :

#include <UTFT.h>
UTFT myGLCD(ITDB32S, 38, 39, 40, 41);
extern uint8_t SmallFont[];

class Parent {
public:
  Parent();
  String nom;
  virtual void select();
  void (* surAppel)(String); // si je mets en virtual --> erreur de compilation
};

class Enfant : public Parent {
public:
  Enfant();
  virtual void select();
  void (* surAppel)(String);
};

class Appel {
public:
  Parent * ptrAppel; // pointeur sur la classe Parent
  void faire() {
    ptrAppel->surAppel(ptrAppel->nom);
  }
};

Appel * appel = NULL; // pointeur sur l'appel

Parent::Parent() {
  nom = "Parent";
  if (appel == NULL)
    appel = new Appel;
}

void Parent::select() {
  appel->ptrAppel = this;
}

Enfant::Enfant() {
  if (appel == NULL)
    appel = new Appel;
}

void Enfant::select() {
  appel->ptrAppel = this; // il faudrait que ce soit le "this" du parent ?
}

Parent leParent;
Enfant lEnfant;

void quoiFaire(String s) {
  myGLCD.print("OK "+s, CENTER, 100);
}

void setup() {
  // put your setup code here, to run once:
  leParent.surAppel = &quoiFaire; // affectation de la fonction "quoiFaire" à l'instance de Parent
  lEnfant.surAppel = &quoiFaire; // affectation de la fonction "quoiFaire" à l'instance de Enfant
  
  /* --- initialisation Arduino --- */
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.setFont(SmallFont);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.setColor(VGA_BLACK);
  myGLCD.clrScr();
  myGLCD.fillScr(VGA_WHITE);
  myGLCD.print("TEST POINTEUR", CENTER, 10);
  /* ---  --- */
  
  leParent.select(); // ça, ça fonctionne
//  lEnfant.select(); // ça, ça ne fonctionne pas, pourquoi ?
  appel->faire();
}

void loop() {
  // put your main code here, to run repeatedly: 

}

Une manière de faire est peut être d’avoir accès, dans la classe enfant, au “this” du parent. Comment faire ?

Merci de votre aide.

Pierre

Bon, j'ai tourné en rond, je pensais avoir supprimer la redéfinition :

void (* surAppel)(String);

dans Enfant. et je cherchais ailleurs. C'était cela la solution.

Cordialement.

Pierre