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