[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] C++ , problemes
Le Thu, 05 Jul 2001 11:41:30 +0200, Pascal Bleser <pbleser@atosorigin.com> a écrit :
> ...
> > > Déjà, tu dois absolument les mettre virtual aussi dans la
> > > classe dérivée (ether):
> > > virtual char* name() {}
> > > virtual void checkLayer() {}
> > Pourquoi ?
> Parce qu'avec virtual, la runtime va vérifier au moment de l'éxécution
> via la table virtuelle (virtual table).
> Et sans virtual, c'est à la compilation qu'est déterminé quelle méthode
> est appellée.
Ok, là, chuis d'accord pour la runtime table cf 2.5.5 du C++ 3ed de Stroustrup.
Mais c'est pas en contradiction avec l'obligation ou non du "virtual" dans les classes-feuilles de ton arbre de dérivation.
>
> C'est une (grosse) erreur d'avoir virtual dans une classe de base et
> de ne pas le répéter dans les classes dérivées. Faut *jamais* faire ca...
>
Là, chuis pas d'accord.
Si ta classe dérivée a une implémentation de la fonction virtuelle de la classe dont il hérite ET qu'elle n'a pas de classe dérivée, tu n'es pas obligé d'écrire 'virtual' pour la fonction dans la classe dérivée.
Et ce n'est pas une erreur du tout, c'est la méthode normale d'implémentation du C++ selon Stroustrup :
Regarde le Stroustrup 3ed du C++, section 2.5.4 Les types abstraits.
L'exemple de création d'une pile engendre une classe abstraite dont 2 fonctions (virtuelles pures dans la classe de base) sont redéfinies dans une classe dérivée, *sans* virtual.
[...]
> > Moi, dans ce cas, je préfère passer un string& en paramètre pour ne pas
> passer un const string& tu veux dire ;)
non, non, pas de const si tu veux modifier le "string" passé en paramètre.
[...]
> Et le linker a cherche une implémentation concrète de la méthode pure virtual de la classe
> de base dans la classe dérivée (puisqu'elle doit nécessairement y etre implémentée - je
> suppose que dans le reste du code source, Jef cree une instance de la classe dérivée).
Pour ça, ok.
Forza Linux.
--
Eugene Sandford
Albert Inc. Rue du Mas de l'Olivier. 34 000 Montpellier
e-mail : esa@albert.com. Tel : (+33) 499 13 09 00; Fax : (+33) 499 13 09 01
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
[ http://LinuxBe.org Contact: listmaster@linuxbe.org ]