Я искал SO немного, но не смогли найти ничего, что ответы на мою проблему правильно (я прочитал this, this и this)Полиморфизм с умными указателями?
В настоящее время я пытаюсь использовать смарт-указатели с полиморфизмом.
Когда я пытаюсь создать смарт-указатель на абстрактный класс с указателем на реализацию, а именно:
std::shared_ptr<Abstract> ptr = std::make_shared(new Implementation);
Мой компилятор (MSVC2012) показывает ошибки о создании экземпляра Abstract
, которое не возможно, потому что он имеет чисто виртуальный, хотя я пытаюсь создать указатель на Implementation
.
Я мог бы просто использовать интеллектуальные указатели совершенно неправильно в этом случае, но тогда я не знаю, что я сделал неправильно (и Visual Studio не подчеркивает строку, о которой я упоминал).
Интересно, можно ли использовать интеллектуальные указатели, когда необходим полиморфизм, и если да, то как это должно быть сделано.
Примечание: я знаю о ковариации, и тот факт, что shared_ptr не тип, который наследует shared_ptr, но думал, что умные указатели справятся с этим.
EDIT:
В соответствии с просьбой, реальная строка кода:
std::shared_ptr<ISpectrometer> ret = std::make_shared<OOSpectrometer>(m_spectroWrapper);
С OOSpectrometer
, что унаследует от абстрактного класса ISpectrometer
(и m_spectroWrapper простой параметр).
ошибка MSVC дает мне (это на французском, так что может отличаться от английского сообщения) является
error C2259: OOSpectrometer : can't instantiate an abstract class due to the following members :
А потом перечисляет чистые виртуальные функции, которые находятся в ISpectrometer
.
Это должно работать, если 'Осуществление 'происходит от' Abstract'. Вы можете показать реальный код? –
И вы можете опубликовать полную ошибку? –
[This] (http://ideone.com/h4hBxQ), например, отлично работает –