当父类 Animal 的speak 前面加上 virtual 关键字之后,这个speak函数就变成了虚函数,Animal类结构发生了变化, 有了一个vfptr (虚函数指针),指向了vftable(虚函数表), 这个虚函数表里面有函数speak的实际地址, 当子类Cat继承了这个Animal类之后,Cat类内部结构 也会有 vfptr,也会指向一个vftable,如果Cat类重写了这个speak这个函数, 那么Cat类的那个 vftable表里面,记录的 函数地址就是 &Cat::speak的地址了