普通成员函数的调用方式是直接通过编译期间确定的函数地址来调用。
多态是通过查询对象的虚函数表来获取虚函数的地址。因为像工厂模式这样,并不能在编译期间知道基类指向的是哪个子类,也就导致了不能在编译期间获取到函数的首地址,也就是不能实现动态绑定。
实际上动态绑定的实现原理是,在程序执行的时候,将子类的虚函数表地址赋值给基类对象的虚函数表指针,再通过查询虚函数表的方式获取最新的函数地址,从而完成了动态绑定。
拓展
上述说明的是动态多态。但是也有静态多态的说法,包括函数重载和函数模板,即:在编译期间通过形参类型推断出函数地址的方法。
(SAW:Game Over!)