#include #include class Base { public: virtual void foo(void) { std::cout << "Base!\n"; } }; class A : public Base { public: A(void) {} A(boost::shared_ptr o) {} virtual void foo(void) { std::cout << "A!\n"; } }; boost::shared_ptr make(boost::shared_ptr pb) { std::cout << "Convert!\n"; boost::shared_ptr p(new A(pb)); return p; } boost::shared_ptr foo(boost::shared_ptr pb) { boost::shared_ptr p(boost::dynamic_pointer_cast(pb) ? pb : make(pb)); return p; } int main(void) { boost::shared_ptr p(new A); boost::shared_ptr pb(new Base); std::cout << "Pass p\n"; boost::shared_ptr result = foo(p); result->foo(); std::cout << "Pass pb\n"; result = foo(pb); result->foo(); return 0; }