虚函数
特征
1.构造和析构中会填写虚表指针
-
先调用父类构造,先填写父类虚表指针,再执行父类构造函数体
-
后调用子类构造,填写子类虚表指针,执行子类构造函数体
-
析构与上述相反(先子类,再父类)
2.虚表特征
- 虚表存放在只读数据区
- 虚表中每个成员都是成员函数指针
3.以填写虚表为界限
- 填写虚表上面是初始化列表
- 填写虚表下面是构造/析构函数体
4.当有虚表的时候,默认就会提供构造
其他补充
1.如何快速判断一个带有虚函数的类的继承层次?
- 在虚表指针的地方下硬件写入断点
- 断点来N次,说明有N-1个父类,减一因为自己也会填一次虚表指针
2.构造析构里调用虚函数会如何?
多态会失效
- 原因:防止父类调用到子类虚函数,子类在未构造的情形下,会调用到未初始化的资源
编译器优化两种方案:
- 构造或析构里调用虚函数为直接调用call address(直接绑定地址)
- 构造或析构里调用虚函数,但仍为本类的虚函数(因为虚表指针此时指向的虚表是自己的)