2013-07-01 1 views
0

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

+0

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

+0

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

+0

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

Répondre

0

Je me répondre à cette pour fermer la question, je commence à penser que c'est une sorte de lien entre l'émission ou sans rapport avec problème. Tous les commentaires ont été très appréciés, merci !!

EDIT: supprimer totalement le projet et le démarrage travaillé à nouveau, je ne peux pas imaginer ce que le issuse était, mais sans doute un bug étrange dans VC de

Merci à tous les!

Questions connexes