面试题答案
一键面试- 非虚函数
baseFunction()
的调用机制:- 非虚函数的调用是在编译期确定的。编译器在编译时,根据对象的静态类型(即声明对象时所使用的类型),直接生成调用该函数的机器码。
- 例如,若有代码
Base b; b.baseFunction();
,编译器知道b
是Base
类型,直接生成调用Base::baseFunction
的指令。这是一种静态绑定机制,不需要额外的运行时开销来确定具体调用哪个函数版本。
- 虚函数
virtualFunction()
的调用机制:- 虚函数的调用是在运行期确定的,采用动态绑定机制。当对象调用虚函数时,编译器会生成代码去查找虚函数表(vtable)。
- 每个包含虚函数的类都有一个虚函数表,对象内部包含一个指向虚函数表的指针(vptr)。在运行时,程序通过对象的 vptr 找到对应的虚函数表,然后根据虚函数在表中的索引找到要调用的具体函数版本。
- 例如,若有代码
Base *ptr = new Derived(); ptr->virtualFunction();
,在运行时,程序要通过ptr
指向对象的 vptr 找到虚函数表,再确定调用Derived::virtualFunction
,这涉及到额外的间接寻址操作,增加了运行时开销。
- 性能差异:
- 由于非虚函数
baseFunction()
的调用在编译期就确定,不需要运行时查找虚函数表等额外开销,所以调用baseFunction()
可能比调用virtualFunction()
具有更好的性能。
- 由于非虚函数