C++面试8——虚函数表(vtable)
C++虚函数表(vtable)深度解析:面试与实战中的陷阱
在C++面试中,理解虚函数表(vtable)的实现机制是考察多态理解深度的关键。以下是深入浅出的解析,包含内存布局、工作原理以及实际开发中的崩溃陷阱:
一、虚函数表核心原理
1. 虚函数表基本结构
class Animal {
public:virtual void speak() { cout << "Animal sound\n"; }virtual void eat() { cout << "Eating\n"; }virtual ~Animal() {}
};class Dog : public Animal {
public:void speak() override { cout << "Woof!\n"; }void bark() { cout << "Barking!\n"; }
};
内存布局:
Animal对象:+----------------+| vptr | --> Animal的vtable+----------------+ [0]: &Animal::speak[1]: &Animal::eat[2]: &Animal::~AnimalDog对象:+----------------+| vptr | --> Dog的vtable+----------------+ [0]: &Dog::speak // 覆盖Animal::speak| Animal部分 | [1]: &Animal::eat // 未覆盖,保持基类版本+----------------+ [2]: &Dog::~Dog // 覆盖析构[3]: &Dog::bark // 新增虚函数
2. 虚指针(vptr)工作机制
Dog