Quick actions

cmd+k|ctrl+k

Navigation

Languages

share_ptr cast

Snippet info

Language

Cpp

Visibility

public

Author

legacy-v1-32

Created

2017-05-03T07:04:05Z

Updated

2017-05-03T07:04:05Z

#include <iostream>
#include <memory>
#include <vector>
#include <string>
 
struct BaseClass {
    std::string foo;
    int bar;
    BaseClass():foo("test10"), bar(0){std::cout<<"test1"<<std::endl;}
    virtual void f();
};
void BaseClass::f()
{
    std::cout << "Hello Base!\n";
    foo = "foo";
    bar = 1;
}
struct DerivedClass : BaseClass
{
    DerivedClass(){std::cout<<"test2"<<std::endl;}
    void f()
    {
        std::cout << "Hello Derived!\n";
        foo = "foo";
        ++bar;
    }
    ~DerivedClass(){ // note, it's not virtual
        std::cout << "~DerivedClass\n";
    }
};
 
int main()
{
    std::vector<std::shared_ptr<BaseClass> > baseVec;
    
    std::shared_ptr<BaseClass> ptr_to_base(std::make_shared<DerivedClass>());
    

    ptr_to_base->f(); // Error won't compile: BaseClass has no member named 'f'
    
    baseVec.push_back(ptr_to_base);
    
    
    std::shared_ptr<BaseClass> ptr_to_base1(new DerivedClass());
    ptr_to_base1->f();
    baseVec.push_back(ptr_to_base1);
 
    std::static_pointer_cast<DerivedClass>(ptr_to_base)->f(); // OK
    // (constructs a temporary shared_ptr, then calls operator->)
 
    static_cast<DerivedClass*>(ptr_to_base.get())->f(); // also OK
    // (direct cast, does not construct a temporary shared_ptr)
    std::cout<<ptr_to_base->bar<<std::endl;
    std::cout<<ptr_to_base->foo<<std::endl;
    
    std::cout<<baseVec.size()<<std::endl;
}
INFO