#include using namespace std; class A { public: A(const string & b = "bar from A") : bar(b) {} virtual void foo() { cout << "this is A::foo() and bar is " << bar << endl; } protected: string bar; }; class B : public A { public: B() : A("bar from B") {} void foo() { cout << "this is B:foo() and bar is " << bar << endl; } }; int main(int argc, char ** argv) { A myA; myA.foo(); B myB; myB.foo(); A otherA = myB; otherA.foo(); // dynamic_cast crashes, triggers a warning "conversion can never succeed" A * tmpA = static_cast(&otherA); otherA = *tmpA; otherA.foo(); return 0; }