[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux] C++ , problemes



...
> > 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.

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...

> On est dans une classe dérivée qui n'a pas besoin de "virtual" sauf si elle a elle aussi une classe dérivée !
Nenni. Si c'est virtual dans la classe de base, tu dois aussi faire virtual.
Sinon t'aura plein d'emmerdes...

> Par contre, le destructeur d'une classe de base doit toujours etre virtuel.
> Et le mot "virtual" pour une fonction, est utilisé dans une classe pour dire que cette fonction
> pourrait (doit si on a =0) etre réutilisée dans une classe dérivée.
Bof.
En fait, ca veut dire qu'il faut vérifier au moment de l'éxécution via la table virtuelle
quelle méthode il faut appeller vraiment.

> > virtual const std::string getName() const {}
> C'est plutot :
> virtual const std::string   &    getName() const {};
> Je suppose que c'est un oubli ;-)
oui ;)

> Moi, dans ce cas, je préfère passer un string& en paramètre pour ne pas
passer un const string& tu veux dire ;)

> avoir à générer de variable temporaire avé le return d'un "const std::string&".
> [...]
> > > > Kesako ??? une idee pour moa ?
> > Oui: il te manque le "virtual" dans la classe dérivée.
> Un, j'ai pas compris son erreur.
> Mais deux, le "virtual" ne sert pas dans une classe dérivée, cela ne sert que si une classe peut ou
> doit etre derivee, donc, dans une classe de base.
Nope, tu fais erreur ;)

Tu ne peux pas "casser" un virtual qui a été mis dans une classe de base.
Ca ne fera jamais ce que tu attends que ca fasse...

Le problème de Jef était au link, ce qui vient de la meme cause mais a une autre raison:
vu que la methode de la classe de base est virtual, elle a un autre nom de symbole que
si elle ne l'etait pas.
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).

--
  -o) / Pascal Bleser                   ATOS Origin|
  /\\ \ e-Business Platform         Aachen, Germany|
 _\_v  \<guru@linuxbe.org> <pbleser@atosorigin.com>|
---------------------------------------------------|
Jesus saves, but Buddha makes incremental backups  :
---------------------------------------------------'

[ 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  ]