虚函数与纯虚函数
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求所有的派生类都要定义自己的实现方法,基类中实现纯虚函数的方法是在函数原型的后面加上"= 0",比如 virtual void f() = 0;
1、动态绑定的定义
有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数。当有一个基类的指针或者引用,该基类的指针或者引用指向不同的派生类对象时,调用该虚函数,那么最终调用的应该是被指向对象所对应的派生类实现的虚函数。
2、为什么能够在运行过程中实现动态绑定?
实现动态绑定,即在运行时能够找到派生类自己实现的虚函数,是因为可以在运行时动态的改变基类指针所指向的对象,即该基类指针指向的地址是可以变化的。对象的内部保存了关于自己和父类的虚函数的关系。因为每次基类都是指向对象本身的,而基类通过对象本身找到了所对应的的虚函数,即派生类的虚函数。
虚函数是类的成员,是所有的对象共有的,因此要特殊保存虚函数应该是类的事情,而不是对象的工作,对象只负责能够找到它就可以了。
编译器会为每个有虚函数的类创建一个虚函数表,里面记录着每个虚函数。另外,每个对象都有一个隐含指针,指向它对应的类的虚函数表。
这样,在运行时动态绑定会按照以下过程调用:
首先,基类指针被赋值为派生类中对象的地址,那么就可以找到指向这个类的虚函数的隐含指针;然后通过该虚函数的名字就可以在这个虚函数表中找到对应虚函数的地址,从而进行调用。
由于继承层次中每个类都有自己的虚函数表,因此各自完成自己的动态绑定,互不影响。