1. 在没有virtual的情况下,以基类指针调用时编译器并不知道比基类更多的东西,通常调用函数的基类版本
2. 当用virtual声明函数时,每当创建一个包含虚函数的类或者从包含虚函数的类派生的类时,编译器就创建一个VTABLE
3. 如果派生类没有对基类的virtual函数进行重新定义,VTABLE中就填充基类的虚函数的地址
4. 编译器会在类中放置一个VPTR,VPTR指向相应的VTABLE,VPTR的初始化在构造函数中完成
1. VPTR 常常在对象的开头
2. 所有的VTABLE有相同的顺序,不管何种类型的对象play()是第一个,what()是第二个,adjust()是第三个,所以编译器知道adjust在VPTR+2处,而不是以instrument::adjust地址调用这个函数(这是早绑定)