как обычно заранее спасибо ...Виртуального ключевого слова и библиотеки
У меня есть класс 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()
, что я получаю эту проблему
Очевидно, что * base * является указателем на базу, а не на гараж. Очень трудно понять, как это могло быть примером Гаража. В вашем вопросе также нет ничего, что подсказывало бы вам убедиться, что это так. –
Вы уверены, что используете виртуальный оператор для createThing(), и вы уверены, что база указывает на экземпляр Garage, а не Base? – sedavidw
Yeah 'base' является указателем на' Base', я где-то читал, что полиморфизм должен начинаться, поскольку это указатель, и я не вызываю его из другого члена или из объекта напрямую? База – Pez