有虚函数时,每个对象的this指针都指向一个虚函数表(Virtual Table)的地址,这个表里存的就是虚函数的地址。编译的时候就决定了,普通函数调用时直接CALL这个函数的地址,而是虚函数时,是从这个虚表里取地址去调用的。
定义了虚函数之后,在执行的时候,系统会自动的匹配与之相对应的合适的成员函数。
这里的话p是指向son的指针,那么他会先调用son里面的成员函数。
你问:那么 p->printf();调用的就是子类函数?
原因:由于子类重载了基类的虚函数,所以在子类对象的虚函数表里面的函数地址是子类的,而不是父类的,所以p->printf(),肯定调用的是子类的printf函数了。
如果子类实现了的就掉子类,子类没实现的就调父类的。
这就是所谓的多态,请看看C++ Primer