2013-05-15 2 views
-1

Я искал 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.

+1

Это должно работать, если 'Осуществление 'происходит от' Abstract'. Вы можете показать реальный код? –

+0

И вы можете опубликовать полную ошибку? –

+0

[This] (http://ideone.com/h4hBxQ), например, отлично работает –

ответ

7

Проблема не с каким-либо разбитым поведением std::shared_ptr относительно полиморфизма, и это сообщение об ошибке довольно ясно:

ошибка C2259: OOSpectrometer: не может создать экземпляр абстрактного класса из-за следующими член :

Ваш класс OOSpectrometer не может быть создан, потому что он является абстрактным. Скорее всего, он не реализует все чистые виртуальные функции, определенные в интерфейсе ISpectrometer.

Кроме того, список чистых функций виртуальных членов, которые не перекрываются OOSpectrometer должна быть частью сообщения об ошибке ваши получают («из-за следующими член: ...»).

+0

Вы правы, и я идиот ... – JBL

+1

@ JBL: Не волнуйтесь, случается со всеми;) –

2

Как говорится в сообщении об ошибке, проблема заключается в том, что OOSpectrometer по-прежнему является абстрактным, а не тем, что он пытается создать абстрактный базовый класс.

Убедитесь, что вы правильно переопределили все чистые виртуальные функции, объявленные в ISpectrometer; особенно те, которые указаны в сообщении об ошибке.

+0

То же самое, вы правы, я идиот. Не проверял, что ВСЕ чистый виртуальный экземпляр был создан, и продолжал проверять проблему с базовым классом ... – JBL

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