Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Максим Россия  
Дата: 29.10.21 14:38
Оценка:
Подскажите, пожалуйста, как shared_ptr осуществляет подобные преобразования

class BaseClass {
};

class DerivedClass : public BaseClass {
};

void pass_shared_ptr(std::shared_ptr<BaseClass> a) {
    std::cout << "ok" << std::endl;
}


В функцию можно передать и DerivedClass

std::shared_ptr<BaseClass> bc_sh_ptr(new BaseClass());
std::shared_ptr<DerivedClass> dc_sh_ptr(new DerivedClass());

pass_shared_ptr(bc_sh_ptr);
pass_shared_ptr(dc_sh_ptr);



По умолчанию это не должно работать, поскольку std::shared_ptr<BaseClass> и std::shared_ptr<DerivedClass> это разные типы. Вот это не работает

template <typename T> class MySharedPtr {
public:
    MySharedPtr(T *t) : t_{t} {}

private:
    T *t_;
};

void pass_my_ptr(MySharedPtr<BaseClass> a) {
    std::cout << "ok" << std::endl;
}


И такой вызов не разрешается

MySharedPtr<DerivedClass> dc_ptr(new DerivedClass());
pass_my_ptr(dc_ptr);
Errare humanum est
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.