Bonjour,
Je lance un peti topic sur la différence entre les fonctions virtuelles et les virtuelles pures. Je n'arrive pas bien à cerner la différence, pouvez vous m'éclairer ne serait-ce qu'un peu sur ce sujet ??
Merci à vous tous !
Bonjour,
Je lance un peti topic sur la différence entre les fonctions virtuelles et les virtuelles pures. Je n'arrive pas bien à cerner la différence, pouvez vous m'éclairer ne serait-ce qu'un peu sur ce sujet ??
Merci à vous tous !
Virtuelle non-pure signifie que la classe de base implémente un comportement par défaut, les dérivées ne sont pas obligées de redéfinir la fonction.
Virtuelle pure signifie au contraire une obligation de redéfinir la fonction pour les dérivée.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Ok, si j'ai bien compris, les prototypes des fonctions que je déclare dans ma classe de base suivie de "=0" sont des fonctions virtuelles pures, il est obligé de les implémenter plus tard dans toutes mes classes dérivées.
Alors que les fonctions que je déclare "virtual" dans ma classe abtraite(fonctions virtuelles non pures), je n'ai pas besoin de les implémenter dans mes classes dérivées.
Ai-je bien compris ?
Merci beaucoup...
Oui tu as bien compris.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Je dirais redéfinir au lieu d'implémenter. Car particularité du C++ : une fonction membre virtuelle pure peut etre implémentée:
Le fait d'avoir au moins une fonction virtuelle pure rend ta classe abstraite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class A { public: virtual void Test() = 0 { } }; class B : public A { virtual void Test() {} };
Salut,
On peut juste rajouter le fait que, bien souvent, les fonctions virtuelle pures poursuivent un seul objectif: faire savoir à la classe de base (qui deviendra alors une "interface") que la fonction existe, mais que l'on ne dispose pas des informations nécessaire (au niveau de la classe de base) pour permettre de définir un comportement par défaut
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Comme conséquence, on peut noter que la classe de base ne sera pas instanciable mais que l'on sait d'ores et déjà que toutes ses classes filles implémentant les fonctions virtuelles pures auront une partie de l'interface (dont font partie les fonctions publiques) en commun avec la classe de base.
polymorphisme
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
En effet koala01, s'il on a le matériel nécessaire pour implémenter une fonction pure dans la classe de base, il est inutile d'utiliser ce type de fonctions, autant tout simplement implémenter la fonction (non virtuelle) dans la classe de base, ainsi, toutes ses classes dérivées y auront accès par la suite.
Merci pour vos réponses à tous.
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Il y a le cas particulier des destructeurs. La norme dit que si une fonction membre virtuelle pure est explicitement appelée, alors elle doit etre implémentée.
Et comme les destructeurs fils appellent automatiquement ceux de leurs parents directs, si tu déclares un destructeur, il faut qu'il soit implémenté, qu'il soit virtuel ou non, virtuel pur ou non. Exemple de code incorrect:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class A { public: virtual ~A() = 0; // destructeur non implémenté }; class B : public A { // le destructeur par défaut appelle A::~A() }; int main() { B *b = new B; delete b; // appel de B::~B() qui appelle A::~A() }Donc la solution est de changer A ainsi:error LNK2019: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ) referenced in function "public: virtual __thiscall B::~B(void)" (??1B@@UAE@XZ) main.obj
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class A { public: virtual ~A() = 0 { } };
Bonjour, quelquechose m'interpèle dans ton code, je ne doute en aucun de son exactitude mais je n'ai jamais vu de destructeur virtuel pur.
Je croyais que dans les classes abstraites, dès qu'il y avait une fonction virtuelle ou virtuelle pure, il fallait également déclarer virtuel le destructeur, de même façon dans les classes dérivées.
Cependant que les fonctions soient virtuelles ou virtuelles pures, j'ai toujours déclarer mon destructeur virtuel, et non virtuel pure.
Quelle est la différence ? Pourquoi déclarer un destructeur virtuel pur aulieu de virtuel ?
Je vous remercie pour vos réponses plus qu'honorables et compréhensives pour moi.
A+
Comme il faut de toute manière en donner une définition, c'est rare. Le seul cas où ça me semble utile est quand le destructeur est la seule chose qui peut être virtuel pur.
C'est souvent nécessaire d'avoir le destructeur virtuel quand on a des membres virtuels, purs ou non, mais ce n'est pas obligatoire.Je croyais que dans les classes abstraites, dès qu'il y avait une fonction virtuelle ou virtuelle pure, il fallait également déclarer virtuel le destructeur, de même façon dans les classes dérivées.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Tu me demandes si cela compile, je n'ai pas essayé, j'ai du mal m'exprimer.
Sinon, merci pour ton explication des destructeurs virtuels purs.
Merci encore à tous!
Bien vu. J'avais lu ce passage dans la norme mais comme ca compile avec VC++ 8 je ne l'ai pas bien pigé. Mais g++ refuse de compiler...
Je n'en n'ai moi meme jamais eu l'utilité. Je sais juste que cela se fait quand on veut rendre la classe abstraite et qu'on ne dispose d'aucune fonction membre virtuelle pure. On fait ainsi s'une pierre 2 coups : rendre le destructeur virtuel, et créer une virtuelle pure pour rendre abstraite.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager