Aktualizacja: shared_ptr w tym przykładzie jest podobne do tego w Boost, ale nie obsługuje shared_polymorphic_downcast (ani dynamic_pointer_cast lub static_pointer_cast w tym przypadku)!
Próbuję zainicjować udostępniony wskaźnik do klasy pochodnej bez utraty liczby odwołań:
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;
Na razie w porządku. Nie spodziewałem się, że C ++ niejawnie przekonwertuje Base * na Derived *. Jednak chcę, aby funkcjonalność wyrażona w kodzie (czyli utrzymanie liczby odwołań podczas obniżania wskaźnika podstawowego). Moją pierwszą myślą było zapewnienie operatora rzutowania w Base, aby mogła mieć miejsce niejawna konwersja do Derived (dla pedantów: sprawdziłbym, czy rzutowanie w dół jest prawidłowe, nie martw się):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Cóż, to nie pomogło. Wygląda na to, że kompilator całkowicie zignorował mój operator typecast. Jakieś pomysły, jak mogę sprawić, by przypisanie shared_ptr działało? Za dodatkowe punkty: jaki to rodzaj Base* const
? const Base*
Rozumiem, ale Base* const
? Do czego to się const
odnosi w tym przypadku?