Reputation: 1188
I have a question about the c++11 pointers. Specifically, how do you turn a unique pointer for the base class into the derived class?
class Base
{
public:
int foo;
}
class Derived : public Base
{
public:
int bar;
}
...
std::unique_ptr<Base> basePointer(new Derived);
// now, how do I access the bar member?
it should be possible, but I can't figure out how. Every time I try using the
basePointer.get()
I end up with the executable crashing.
Thanks in advance, any advice would be appreciated.
Upvotes: 34
Views: 49888
Reputation: 20093
If they are polymorphic types and you only need a pointer to the derived type use dynamic_cast
:
Derived *derivedPointer = dynamic_cast<Derived*>(basePointer.get());
If they are not polymorphic types only need a pointer to the derived type use static_cast
and hope for the best:
Derived *derivedPointer = static_cast<Derived*>(basePointer.get());
If you need to convert a unique_ptr
containing a polymorphic type:
Derived *tmp = dynamic_cast<Derived*>(basePointer.get());
std::unique_ptr<Derived> derivedPointer;
if(tmp != nullptr)
{
basePointer.release();
derivedPointer.reset(tmp);
}
If you need to convert unique_ptr
containing a non-polymorphic type:
std::unique_ptr<Derived>
derivedPointer(static_cast<Derived*>(basePointer.release()));
Upvotes: 59