Vptr虚函数表指针什么时候初始化?
" 虚函数表 " 由 C++ 编译器 负责 创建 与 维护 , 被 virtual 关键字 修饰的 虚函数 , 会自动 被 C++ 编译器 存储到 " 虚函数表 " 中 , 类中会自动添加一个 " vptr 指针 " 成员变量 指向 虚函数表 ;
vptr 指针初始化时机:
对象中的 vptr 指针指向虚函数表, 在对象被创建时, 由C++编译器 对 对象中的vptr指针进行初始化操作, 对象创建完成后, 也就是虚函数整理完毕, 全部放到虚函数表中后, vptr指针才会指向虚函数表的首地址。
总之,构造函数的作用就是创建对象 , 构造函数最后一行代码执行完成, 才意味着对象构建完成, 对象构建完成后, 才会将vptr指针 指向 虚函数表;如果在构造函数中调用虚函数, 则没有多态效果。
多态实现的原理
1、静态多态主要是同名函数的重载,在编译的时候就已经确定。编译器会根据函数实参的类型(可能会进行隐式类型转换),来确定具体调用哪个函数,如果有对应的函数就调用该函数,否则会出现编译错误。
2、动态多态主要是父子类同名函数的覆盖,运行时的多态,是用虚函数机制实现的,在运行期间动态绑定。编译器在编译的时候,会为每个包含虚函数的类创建一个虚表和虚表指针。该表是一个一维数组,在虚表中存放了每个虚函数的地址。程序运行时,会根据对象的实际类型来初始化虚表指针,让虚表指针指向所属类的虚表。在调用虚函数的时候,能够根据函数地址找到正确的函数。
虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表