5 Les fonctions virtuelles pures et les classes virtuelles pures

Aller, on en remet une couche.

J'ai encore un petit truc à vous dire sur les fonctions virtuelles, vous pouvez définir des fonctions virtuelles qui ne sont pas implémentés, elle sont donc virtuelles pure.

Qu'est-ce que ça veut dire ?

Ça veut dire que, vous aller créer une classe, mais que vous ne pourrez pas utiliser sans hérité et sans redéfinir la fonction virtuelle pure.

Heu...

Bon, faisons un exemple, ça sera plus clair.

Admettons que vous voulez faire une classe AnimalMarrin, qui sera donc une classe très générale, dont il faudra hérité pour faire votre écosystème. A-priori, vous ne pouvez pas dire comment se nourri un animal marin, ni comment il mange, il y en à trop de différent, ça serait absurde. Et allons encore plus loin, dans le fond (c'est le cas de le dire), un AnimalMarrin ça n'existe pas.

Heu, ben si.

Regardez, vous allez faire de la plongée sous-marine dans l'océan (ça tombe bien), vous allez voir des anémones de mer, des étoiles de mer, des crabes, des poissons clowns, du corail, des requins marteaux, des grandes roussettes, des lamproies et j'en passe. Mais vous n'aller pas voir de crustacés, un crustacé ce n'est pas un animal, c'est une manière de les classés, comme un mammifère ou un insecte. Tout ça pour dire que ce n'est pas votre AnimalMarrin qui va chasser, c'est bien votre Lamproie ou votre Crabe.

Donc vous ne pouvez pas implémenter des fonctions comme chasser ou manger car chaque espèce à sa manière de faire.

Oui, mais on peut les laissées vide.

Bien sur, mais dans ce cas vous allez vous retrouver avec quelqu'un qui va vous faire chasser un AnimalMarrin et pas Crabe (bon, d'accord ça pourrait être rigolo mais c'est pas le but, enfin pas totalement).

Bien, pour en revenir à notre Crustace (on ne va pas faire un écosystème tout de suite), en suivant le même raisonnement que précédemment on peut se dire qu'il ne peut pas parler (bon, de base non, mais pour l'exemple si), donc la fonction parler du Crustace doit être virtuelle pure.

Voici la fonction dans le fichier crustace.h :

1
virtual void parler()=0;

Et voilà, il suffit de mettre un =0 après la définition de la fonction et c'est tout.

Vous devez enlever l'implémentation de la fonction parler dans le fichier crustace.cpp.

Si vous recompilez tout fonctionnera car on a déjà redéfinit la fonction parler dans Crevette et dans Langouste.

Mais si vous essayez de définir un Crustace, le compilateur va râler.

Voilà ce que le compilateur va vous dire si vous définissez un Crustace dans le main :

make
Scanning dependencies of target crustace
[ 25%] Building CXX object CMakeFiles/crustace.dir/main.cpp.o
main.cpp: In function ‘int main(int, char**)’:                                           
main.cpp:16:11: erreur: cannot déclare variable ‘custace’ to be of abstract type ‘Crustace’
crustace.h:8:7: note:   because the following virtual functions are pure within ‘Crustace’:
crustace.h:14:16: note:         virtual void Crustace::parler()
make[2]: *** [CMakeFiles/crustace.dir/main.cpp.o] Erreur 1
make[1]: *** [CMakeFiles/crustace.dir/all] Erreur 2
make: *** [all] Erreur 2

Il va vous dire qu'il ne peut pas déclarer de variable custace (je l'ai appelé comme ça) de type abstrait Crustace :

main.cpp:16:11: erreur: cannot declare variable ‘curstace’ to be of abstract type ‘Crustace’

Car la fonction suivante (void Crustace::parler()) est virtuelle pure :

crustace.h:8:7: note:   because the following virtual functions are pure within ‘Crustace’:
crustace.h:14:16: note:         virtual void Crustace::parler()

Enfin, si vous voyez ça, c'est que vous avez oubliez de définir la fonction qu'il vous à donnée (ici void Crustace::parler()).

Il suffit que d'une fonction virtuelle pure dans une classe pour que la classe devienne virtuelle pure (abstraite).