share_ptr cast

Run Settings
LanguageC++
Language Version
Run Command
#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; }
Editor Settings
Theme
Key bindings
Full width
Lines