#include <iostream>
struct Object { virtual void foo() { std::cout << "Object::foo();" << std::endl; } };
struct PhysicsObject: Object { virtual void foo() { std::cout << "PhysicsObject::foo();" << std::endl; } };
struct Ball: PhysicsObject { virtual void foo() { std::cout << "Ball::foo();" << std::endl; } };
struct SoftBall: Ball { virtual void foo() { std::cout << "SoftBall::foo();" << std::endl; } };
int main()
{
Object* o = new SoftBall;
o->foo();
delete o;
return 0;
}