Передача shared_ptr < Derived > как shared_ptr < Base >

Promise then возвращает promise object, а не promise's resolved value. Я разветвил JSFiddle и добавил некоторые из моих попробовать это .

promise.then выполняется сразу после этого promise object.

65
задан Matt Kline 26 September 2016 в 03:02
поделиться

1 ответ

Хотя Base и Derived являются ковариантными и необработанные указатели на них будут действовать соответственно, shared_ptr<Base> и shared_ptr<Derived> не являются не ковариантными. dynamic_pointer_cast является правильным и простым способом решения этой проблемы.

( Редактировать: static_pointer_cast было бы более уместно, потому что вы проводите от производной к базовой, что безопасно и не требует проверок во время выполнения. См. Комментарии ниже.)

Однако, если ваша функция foo() не желает участвовать в продлении срока службы (или, скорее, участвовать в общем владении объектом), то лучше всего принять const Base& и разыменовать shared_ptr ] при передаче его на foo().

void foo(const Base& base);
[...]
shared_ptr<Derived> spDerived = getDerived();
foo(*spDerived);

Кроме того, поскольку типы shared_ptr не могут быть ковариантными, правила неявного преобразования через ковариантные типы возвращаемых данных не применяются при возврате типов shared_ptr<T>.

38
ответ дан Bret Kuhns 26 September 2016 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: