1 什么是动态绑定
有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数。现在有一个基类的指针或者引用,当该基类指针或者引用指向不同的派生类对象时,调用该虚函数,那么最终调用的是该被指向对象对应的派生类自己实现的虚函数。
2 为何能够在运行时找到派生类自己实现的虚函数呢?
2.1 肯定不是编译期指定好了的
因为可以在运行时,动态的改变该基类指针指向的对象。也就是说,该基类指针指向的地址是可以变化的。可见,是对象内部保存了关于自己和父类的虚函数的线索。因为基类每次都是指向对象本身的,它通过对象本身找到了对应的虚函数。
2.2 对象和类的数据结构的支持
虚函数是类的成员,是所有的对象所共有的,因此要特殊保存虚函数也应该是类的事情,而不是对象的事情,对象只要能够找到它们就可以了。
是这样设计的,编译起会为每个有虚函数的类都创建一个虚函数表,里面记录着每个虚函数。另外,每个对象有一个隐含指针指向它对应的类的虚函数表。
这样,在运行时,动态绑定的调用过程是这样的,首先,基类指针被赋值为派生类对象的地址,那么就可以找到指向这个类的虚函数的隐含指针,然后通过该虚函数的名字就可以在这个虚函数表中找到对应的虚函数的地址。然后进行调用就可以了。
由于继承层次中每个类都有自己的虚函数表,因此各自完成自己的动态绑定,互不影响。