#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;
}