общий кастинг - PullRequest
       27

общий кастинг

3 голосов
/ 26 февраля 2011
class Object { };
Class Derived : public Object { };

boost::shared_ptr<Object> mObject(new Derived); // Ok

Но как привести его к boost::shared_ptr<Derived>?

Я пробовал что-то вроде: static_cast< boost::shared_ptr<Derived> >(mObject), и это не удалось.

Единственная рабочая идея:

boost::shared_ptr<Derived> res(new dynamic_cast<Derived*>(mObject.get()))

Ответы [ 2 ]

12 голосов
/ 26 февраля 2011

НЕ передавайте результат приведения в новый конструктор shared_ptr. Это приведет к тому, что два shared_ptr решат, что владеют объектом, и оба попытаются удалить его. Результатом будет двойное освобождение и вероятный крах.

shared_ptr имеет функции приведения специально для этого.

0 голосов
/ 27 февраля 2014

Вы можете попробовать

class Object { };
Class Derived : public Object { };

boost::shared_ptr<Object> mObject = new Derived; // OK
boost::shared_ptr<Derived> mDerived = 
    boost::static_pointer_cast<Derived, Object>(mObject); // OK

Boost имеет соответствующие шаблоны для выполнения стандартных приведений, определенных в c ++.

...