在C++中, 最常见的多态指的是用基类指针指向一个派生类的实例, 当用该指针调用一个基类中的虚函数时, 实际调用的是派生类的函数实现,而不是基类函数。 如果该指针指向另一个派生类实例, 则调用另一个派生类的函数实现。因此, 比如工厂模式返回一个实例, 上层函数不需要知道实例来自哪个派生类, 只需要用一个基类指针指向它,就可以直接获得需要的行为。 从编译的角度来看,函数的调用地址并不是在编译阶段静态决定, 而是在运行阶段,动态地决定函数的调用地址。
多态是通过虚函数表实现的。 当基类中用virtual关键字定义函数时, 系统自动分配一个指针,指向该类的虚函数表。 虚函数表中储存的是函数指针。在生成派生类的时候, 会将派生类中对应的函数的地址写到虚函数表。之后, 当利用基类指针调用函数时, 先通过虚函数表指针找到对应的虚函数表, 再通过表内储存的函数指针调用对应函数。 由于函数指针指向派生类的实现, 因此函数行为自然也就是派生类中定义的行为了。
—
Excerpt From: Yichao, Xiami, XiaoXiao & Fei Dong. “程序员面试白皮书.” iBooks. https://itun.es/us/zcOJ6.l