Примечание. Для простоты в этом примере я использую основные указатели.Фактический код использует boost::shared_ptr
.
И в этом ваша проблема: вы не можете dynamic_cast
a shared_ptr<A>
до shared_ptr<B>
, поскольку эти два типа на самом деле не связаны друг с другом, дажеесли A
и B
.
К счастью, в конкретном случае в вашем вопросе dynamic_cast
не должно быть необходимым, поскольку Record_ID_As_Field*
должен быть неявно преобразован в Field_Interface*
(так какодно происходит от другого).shared_ptr
реализует операторы преобразования, которые поднимают эти неявные преобразования в соответствующие shared_ptr
объекты, поэтому shared_ptr<Record_ID_As_Field>
должен быть неявно преобразован в shared_ptr<Field_Interface>
.
Если вы пропустите dynamic_cast
, он должен работать.
Если вам действительно нужно выполнить динамическое приведение, вы можете использовать специальный конструктор .по shared_ptr
:
shared_ptr<Record_ID_As_Field> raf;
shared_ptr<Field_Interface> fi(raf, dynamic_cast<FieldInterface*>(raf.get());
(я не уверен, что произойдет, если произойдет сбой dynamic_cast
, поэтому вам следует выяснить, как лучше всего справиться с этой ситуацией.)