2013-07-01 5 views
0

как обычно заранее спасибо ...Виртуального ключевого слова и библиотеки

У меня есть класс Base и класс Thing оба определены в base.lib

Base класса защищенного виртуальной функцию createThing(), которая, как вы можете догадаться, создает и возвращает экземпляр Thing

Теперь; У меня также есть другой проект, назовем его «Гараж».

В этом проекте у меня есть класс Garage, который (публично) происходит от Base. Я также создаю класс Car, который происходит от Thing.

В Garage, я переопределяю createThing(), чтобы вернуть экземпляр Car.

OK.

Вот где это усложняется.

Base В моем случае на самом деле создается рабочая нить (я пробовал как ставить тело нитей как частный член Base, как член отдельного класса).

В рамках этого рабочего потока, createThing() вызывается через указатель следующим образом:

Thing* thing = base->createThing(); 

Какой штраф и денди при тестировании Base сам по себе.

Однако, как только я делаю новый проект и ссылку на base.lib, создавая свои Garage и Car классов, как описано выше, выше строка всегда вызывает конструктор для Thing и никогда для Car

Может кто-нибудь, пожалуйста, объясните, что Я поступаю неправильно?

спасибо :)

Edit: В этом примере (и в моем фактическом коде), переменной base определенно указывает на экземпляр Garage

Другой тест я просто попытался, если я бросил мой Garage (созданный в стеке) до указателя Base, затем позвоните base->createThing(), он работает как и ожидалось.

Только тогда, когда я позволяю вызов рабочего потока base->createThing(), что я получаю эту проблему

+0

Очевидно, что * base * является указателем на базу, а не на гараж. Очень трудно понять, как это могло быть примером Гаража. В вашем вопросе также нет ничего, что подсказывало бы вам убедиться, что это так. –

+0

Вы уверены, что используете виртуальный оператор для createThing(), и вы уверены, что база указывает на экземпляр Garage, а не Base? – sedavidw

+0

Yeah 'base' является указателем на' Base', я где-то читал, что полиморфизм должен начинаться, поскольку это указатель, и я не вызываю его из другого члена или из объекта напрямую? База – Pez

ответ

0

Я отвечаю это сам, чтобы закрыть этот вопрос, как я начинаю думать, что это какое-то проблема со ссылками или несвязанной проблема. Все комментарии были высоко оценены, спасибо!

EDIT: Полностью удалить проект и начать снова работал, я не могу себе представить, что было issuse но предположительно некоторая нечетная ошибка в VC++

Спасибо всем!

Смежные вопросы