Quels sont les arguments pour choisir entre un design classique héritage virtuel etc et une implémentation à l'aide de templates ?
j'ai l'impression qu'à chaque fois les deux sont possibles, mais je ne sais pas quel critère retenir pour arbitrer....
Quels sont les arguments pour choisir entre un design classique héritage virtuel etc et une implémentation à l'aide de templates ?
j'ai l'impression qu'à chaque fois les deux sont possibles, mais je ne sais pas quel critère retenir pour arbitrer....
Ce que tu demandes est un non sens puisque template et héritage sont orthogonaux. Ils n'entrent pas en concurrence, ils se complètent.
"Never use brute force in fighting an exponential." (Andrei Alexandrescu)
Mes articles dont Conseils divers sur le C++
Une très bonne doc sur le C++ (en) Why linux is better (fr)
hum je vois. Mais dans le cas du CRTP on a bien à faire à quelquechose de non orthogonal non ?
Dans le cas du CRTP, on simule du polymorphisme d'inclusion (virtual) avec des templates, mais les deux ne sont pas mélangés. Mais dans ce cas tu ne pourras pas stocker par exemple pleins d'éléments de cette hiérarchie dans un même conteneur, car la classe mère est template et donc Mere<int> est incompatible avec Mere<std::string> par exemple.
Je te conseille de lire cette page : http://cpp.developpez.com/faq/cpp/?p..._polymorphisme depuis l'ancre que j'ai donnée jusque tout en bas.
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++
Bonsoir,
personnellement, je privilégie toujours les templates par rapport à l'héritage, quand c'est possible, de manière à conserver de bonnes performances. Je fais notamment tout pour éviter d'avoir à utiliser la vitualité pure.
Oui, et elle varie énormément en fonction du compilateur.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Bonsoir,
je ne suis pas suffisamment calé en C++ pour amener des arguments théoriques ou techniques : il s'agit de tests très simples que j'ai fait avec gcc et le compilateur de Visual. Ces tests avaient d'ailleurs donné lieu à une discussion dans ce même forum. Ceci dit, je tiens à préciser que dans tous mes messages je fais bien référence à l'héritage conformément à la question initiale de guillaume07. Pour être concret, lorsqu'on fait une classe abstraite dont héritent plusieurs classes, on peut perdre énormément en performances sur des méthodes même très élémentaires. Je n'en connais malheureusement pas la raison.

je veux bien voir ca aussi. a priori c'est pas possible...
Salut,
On parle bien de comparer :
Avec :
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
17 struct A { virtual void fonction(){} }; struct B : public A { virtual void fonction(){} }; int main() { B b; A &ra = b; ra.fonction(); return 0; }
Et non pas avec :
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
17 struct A { virtual void fonction()=0; }; struct B : public A { virtual void fonction(){} }; int main() { B b; A &ra = b; ra.fonction(); return 0; }
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
17 struct A { void fonction(){} }; struct B : public A { void fonction(){} }; int main() { B b; A &ra = b; ra.fonction(); return 0; }
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Bonjour,
j'ai retrouvé la discussion : ça sera plus simple que des longs discours.
http://www.developpez.net/forums/d96...-performances/
Si ma mémoire est bonne, le problème se pose lorsqu'on déclare le destructeur.

salut,
je ne vois pas un seul virtuel dans ton code! c'est moi ou bien...
J'ai survolé le lien et je me demande si ce n'est pas simplement le fait du destructeur : dans un cas c'est le destructeur implicite probablement squizzé par le compilo et dans l'autre c'est un destructeur explicite virtuel probablement pas éliminé par gcc en mode release. Faudrait remonter une manip.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager