怎么分析这个程序(虚构函数)

#include
using namespace std;
class ONE{
public:
virtual void f(){cout<<"1";}
};
class TWO:public ONE{
public:
TWO(){cout<<"2";}
};
class THREE:public TWO{
public:
virtual void f(){TWO::f();cout<<"3";}
};
int main()
{
ONE aa,*p;
TWO bb;
THREE cc;
p=&cc;
p->f();
return 0;
}

//p是顶级父类指针,可以理解为只指向子类的继承部分
p=&cc;
//先检查子类THREE有f()方法,调用子类THREE的方法
//如果没有,往父类找
p->f();
return 0;