comme d'habitude grâce à l'avance ...mot-clé virtuel et les bibliothèques
J'ai la classe Base
, et la classe Thing
qui sont tous deux définis dans base.lib
La classe Base
a une fonction virtuelle protégée createThing()
qui, comme vous pourriez deviner crée et renvoie une instance d'un Thing
maintenant; J'ai aussi un autre projet, appelons-le "Garage". Dans ce projet, j'ai la classe Garage
qui (publiquement) dérive de Base
. Je crée également la classe Car
qui dérive de Thing
.
Dans Garage
, je remplace createThing()
pour renvoyer une instance d'un Car
.
OK.
Voici où ça devient compliqué. Dans mon cas, crée réellement un thread de travail (j'ai essayé de mettre le corps des threads en tant que membre privé de Base
, en tant que membre d'une classe séparée).
Dans ce thread de travail, createThing()
est appelé par un pointeur comme ceci:
Thing* thing = base->createThing();
Ce qui est bien et dandy lors du test Base
par lui-même.
Cependant, dès que je fais un nouveau projet et un lien vers base.lib
, créant mes Garage
et Car
les classes comme décrit, la ligne ci-dessus toujours appelle le constructeur pour Thing
et jamais pour Car
Quelqu'un pourrait-il s'il vous plaît expliquer Je fais mal?
Merci de
l'Edit: Dans cet exemple (et dans mon code réel), les variables base
Definatly des points à une instance de Garage
Un autre test que je viens d'essayer, si je jetai Garage
(créé sur la pile) à un pointeur Base
, puis appelez base->createThing()
, cela fonctionne comme prévu.
Il est seulement quand je laisse le thread de travail appel base->createThing()
que je reçois ce problème
Clairement * base * est un pointeur vers Base, pas Garage. Très difficile de voir comment cela pourrait être une instance de Garage. Il n'y a rien dans votre question qui suggère que vous avez vérifié que c'était le cas. –
Etes-vous sûr d'avoir utilisé l'opérateur virtuel sur createThing() et êtes-vous sûr que base pointe vers une instance de Garage et non Base? – sedavidw
Ouais 'base' est un pointeur vers' Base', j'ai lu quelque part que le polymorphisme devrait fonctionner puisqu'il s'agit d'un pointeur et que je ne l'appelle pas depuis un autre membre ou depuis l'objet directement? – Pez