今天上课的时候讲到Vtable,虽然早就知道有Vtable这回事,今天趁着总结一下:
Vtable的作用就是实现多态。表里存放着父类以及包括本身类的虚函数的地址,表位于实例对象的首地址,即由一个对象的地址就可以得到虚函数表。表以NULL结束。
CBase b
CDerived: public CBase
CDerived类不对继承来的虚函数进行覆盖。并且也定义自己的虚函数
则CDerived d
虚函数表中 父类的虚函数位于子类虚函数之前,并且按声明顺序排列
如果CDerived对父类的虚函数进行覆盖,也定义自己的虚函数
则CDerived d
父类中虚函数在虚函数表中的位置被子类重写的函数覆盖,没有被覆盖的函数没有发生变化
这样子就实现了多态
CDerived d = new CDerived;
CBase* cb = &d;
cb->f();
调用的是CDerived的f()而不是CBase的,因为在虚函数表中,CBase的f()位置已经被CDerived 的f()地址覆盖
那么这样子只要是虚函数,则子类就可以访问父类的成员了
代码如下:
typedef void(*Fun)(void);