Оновлення: shared_ptr у цьому прикладі схожий на той, що в Boost, але він не підтримує shared_polymorphic_downcast (або динамічний_pointer_cast або static_pointer_cast для цього питання)!
Я намагаюся ініціалізувати спільний покажчик до похідного класу, не втрачаючи підрахунку:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
Все йде нормально. Я не очікував, що C ++ неявно перетворить Base * в Derived *. Однак я хочу, щоб функціонал, виражений кодом (тобто, підтримка підрахунку посилань при зниженні базового покажчика). Моя перша думка полягала в тому, щоб надати Base-оператора для того, щоб відбулося неявне перетворення на Derived (для педантів: я би перевірив, чи є нижчий склад правильним, не хвилюйтеся):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Ну, це не допомогло. Здається, компілятор повністю проігнорував мого оператора typecast. Будь-які ідеї, як я можу зробити так, щоб завдання на спільне використання_ptr працювали? За додаткові бали: що це за тип Base* const
? const Base*
Я розумію, але Base* const
? На що const
йдеться у цьому випадку?