虚函数表与虚函数表指针
- 虚函数表指针:
虚函数表指针又称为:虚表指针。虚表指针指向的是一张虚函数表。
- 虚函数表:
虚函数表又称为:虚表。虚表中存放的是虚函数指针,因此虚表可以看成是一个函数指针数组。虚表在编译阶段生成。
- 虚表指针在哪里?
虚表指针存在于有虚函数的类对象中;
- 虚表在哪里?
虚表存在于.rodata段;
- 虚函数在哪里?
虚函数保存在代码段;
- 基类虚表的构建规则:
按照虚函数在基类中的声明顺序存放在虚函数表中。
- 派生类虚表的构建规则:
- 将基类虚表中的内容拷贝一份保存到派生类的虚表中;
- 如果派生类中重写了基类中的虚函数,那么在派生类的虚表中,派生类重写后的虚函数地址将替换(覆盖)掉继承下来的虚函数地址;
- 派生类自己增加的虚函数,按照在派生类中的声明顺序存放在派生类的虚表的后边;(注意:在VS下监视窗口查看时,没有显示);
即派生类虚表中保存的是继承的未被重写的虚函数,派生类重写之后的虚函数以及派生类自己的虚函数的地址;
- 虚函数表作用:
用来解决保存虚函数的问题以及实现多态的基础;
虚基类表和虚基类表指针
- 虚基类表指针:
虚基类表指针又称为:虚基表指针;是虚继承下来的派生类中的成员;指向一张虚基表;
- 虚基类类表:
虚基类表又称为:虚基表;虚基表中记录了虚基类与派生类的偏移地址;通过偏移地址,这样就找到了虚基类成员;
虚基表中存放两个成员:一个是0(可以认为是虚基类与自己的偏移量),另一个是虚基类与派生类的偏移量;
- 虚基表指针在哪里?
虚基表指针存在于虚继承的派生类对象中;
- 虚基类表的作用
虚基类表就是用来解决继承过程中,菱形继承的二义性和数据冗余的问题。
虚基表指针和虚表指针对比
虚基表指针 | 虚表指针 | |
---|---|---|
生成条件 | 续集继承时产生 | 有虚函数时产生 |
指向 | 指向虚基表 | 指向虚表 |
指向内容 | 派生类对象中的基类成员对于该对象首地址的偏移量 | 类中所有虚函数的地址 |
作用 | 解决菱形继承时的二义性和数据冗余的问题 | 是多态的基础 |