虚函数列表是属于类的,父类和子类都会有各自的虚函数列表,
__vfptr
属于对象的,每个对象
都有各自
__vfptr
。
多态实现的原理:
1.
由于子类继承父类,不但继承了父类的成员,也会继承父类的虚函数列表。
2.
编译器会检查
子类是否有重写父类的虚函数,如果有,在子类的虚函数列表中会替换掉父类的虚函数
,一般称之为覆盖
,覆盖后便指向了子类的虚函数。
3.
如果子类没有重写的父类虚函数,父类虚函数会保留在子类的虚函数列表中。
4.
如果子类定义了独有的虚函数,按顺序依次添加到虚函数列表结尾。
以上这些过程在编译阶段就完成了。
多态实现流程:父类指针指向子类对象,
__vfptr
在子类的初始化参数列表中被初始化,指向子类的虚函数列表,
申请哪个子类对象__vfptr就指向了哪个子类的虚函数列表
。调用虚函数时执行虚函数的调用流
程,则实现了多态。