Qu'es-ce qu'une fonction virtuel

Bonjour,

Je découvre un type de fonction que je ne connais pas.

J'essaye de debuger mon code.
Dans mon fichier .cpp, la fonction

sendPacket(cahr, int));

est appelée. Alors je cherche dans ce fichier cette fonction. Cependat, je ne la touve pas.

Je vais voir alor dans mon fichier .h et la je vois

virtual bool sendPacket(uint8_t *buffer, uint16_t len) = 0;

Qu'es-ce qu'une fonction virtuel?
Et comment je peux la trouver pour mettre des

Serial.println(buffer)

par exemple?

Merci

C'est drôle, j'ai justement lu pas mal aujourd'hui sur le sujet! On va voir si j'ai compris ce que j'ai lu. :slight_smile:

Une fonction virtuelle est une fonction qui est définie dans une classe (une méthode, donc), et que les classes filles peuvent réimplémenter.

C'est à dire qu'une classe B qui hérite de la classe A héritera de toute ses méthodes, jusque là pas de problème. La classe B peut surcharger une méthode de la classe A, toujours pas de problème. Quand on appellera cette méthode sur la classe fille, c'est la méthode surchargée qui sera utilisée.
Par contre, si jamais je veux accéder à cette méthode de la classe B via un pointeur sur la classe A, pour une raison qui m'est propre, c'est la méthode définie dans la classe mère qui sera utilisée.
Le mot clef virtual permet de changer ce comportement. Si j'appelle la méthode sur la classe mère, c'est la méthode de la classe mère qui est utilisée. Si je l'appelle sur la classe fille, c'est celle de la classe fille qui est utilisée. Et si je crée un pointeur de type classe mère, et que j'y attribue l'adresse d'une classe fille, c'est la méthode de la classe fille qui sera appelée.

Dans ton cas, le "= 0" à la fin de la définition indique que la méthode est purement virtuelle, c'est à dire que la classe mère n'en fournit pas de définition par défaut, ce qui fait de ta classe une classe abstraite. C'est à dire que cette classe ne peut pas être instanciée dans un code, elle ne peut être utilisée que comme parente d'une autre classe. Puisqu'elle est abstraite, il appartient à chaque classe fille d'implémenter cette fonction. Si elle ne le font pas, elle seront à leur tour abstraites, et ne pourront donc être utilisées que comme parentes d'autres classes.

Il y a ici un excellent cours sur la question. Il te sera peut-être nécessaire de parcourir les chapitres précédent pour revenir sur les notions d'héritage et de pointeurs si besoins...

Salut Troisièmetype,

Merci pour celle belle explication!