面试题答案
一键面试虚拟函数动态绑定基本过程
- 编译期准备:
- 当一个类中包含虚函数时,编译器会为该类生成一个虚函数表(vtable)。虚函数表是一个存储该类虚函数地址的数组。
- 每个包含虚函数的类的对象都包含一个指向该虚函数表的指针(vptr),这个指针通常被编译器安放在对象的首部。
- 运行时绑定:
- 在类继承体系下,当通过基类指针或引用调用虚函数时,程序会在运行时根据对象实际的类型来确定调用哪个版本的虚函数。
- 具体过程为:首先通过对象的vptr找到对应的虚函数表,然后根据虚函数在虚函数表中的索引找到实际要调用的虚函数的地址,最后调用该函数。
代码示例
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base::print()" << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "Derived::print()" << std::endl;
}
};
int main() {
Base* basePtr = new Base();
basePtr->print(); // 调用 Base::print()
basePtr = new Derived();
basePtr->print(); // 调用 Derived::print(),动态绑定
delete basePtr;
return 0;
}
在上述代码中,Base
类包含一个虚函数print
。Derived
类继承自Base
类并覆盖了print
函数。在main
函数中,通过Base
类指针分别指向Base
类对象和Derived
类对象,调用print
函数时,根据对象实际类型实现了动态绑定。