Обновление: shared_ptr в этом примере похоже на файл в Boost, но он не поддерживает shared_polymorphic_downcast (или dynamic_pointer_cast или static_pointer_cast, если на то пошло)!Downcasting shared_ptr <Base> to shared_ptr <Derived>?
Я пытаюсь инициализировать общий указатель на производный класс, не теряя при этом счетчик ссылок:
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 *. Тем не менее, я хочу функциональность, выраженную кодом (то есть, поддерживая подсчет ссылок при подавлении базового указателя). Моя первая мысль была, чтобы обеспечить оператор приведения в Базе, так что неявное преобразование в Derived может иметь место (для педантов: Я хотел бы проверить, что вниз бросок действительно, не волнуйтесь):
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
Ну, это не помогло. Кажется, компилятор полностью проигнорировал мой оператор-оператор. Любые идеи, как я мог бы сделать назначение shared_ptr работать? За дополнительные баллы: какой тип Base* const
есть? const Base*
Я понимаю, но Base* const
? К чему относятся const
?
Зачем вам нужен shared_ptr, а не shared_ptr ? –
Bill
Поскольку я хочу получить доступ к функциям в Derived, которые не находятся в базе, без клонирования объекта (я хочу, чтобы один объект ссылался на два общих указателя). Кстати, почему не работают литые операторы? –