子类在覆盖(重写)父类的虚函数时,名称和参数列表必须保持一致,不然就不会发生虚函数的覆盖(重写),而是屏蔽了父类的该函数。
虚函数的调用开销
- 虚函数相较与普通函数,多了一次访问内存的操作,需要通过虚表指针找到虚表再调用该函数。因此虚函数的调用是一个间接调用,但这对性能的影响不是很大。
- 间接调用产生了一个新的问题,就是现代处理器流水线的分支预测可能会失败,这时需要重新取指,译码,运行,写回。但是现代处理器预测的成功率还是挺高的。
- 影响比较明显的是虚函数抑制了内联函数,这带来了较大影响。不能内联还会影响编译器做一些优化,比如常量折叠和常量传播
编译器对内联的一些优化:
- 消除了调用、返回、参数传递等开销
- 缓存更优,因为代码连续
- 指针消除
- 公共表达式消除
- 寄存器变量选择优化
- 循环展开
- 循环不变代码
- 指令重排
内联的缺点:
多个地方调用一个内联的话会使得代码量变大