请解释C++中虚函数的实现机制,并说明它如何支持多态。
考察说明
考查对C++虚函数底层实现和多态机制的理解。
回答思路
- 【回答框架 1】虚函数是C++实现运行时多态的核心机制。每个含有虚函数的类都有一个虚函数表(vtable),其中存储了该类所有虚函数的地址。每个对象内部有一个虚函数指针(vptr),指向所属类的虚函数表。
- 【回答框架 2】当通过基类指针或引用调用虚函数时,实际执行哪个函数由对象的动态类型决定。编译器在调用点生成通过vptr查找函数地址的代码,实现动态绑定。
- 【回答框架 3】构造函数设置vptr指向当前类的虚函数表,因此构造期间虚函数调用不会表现为多态。析构函数同理。
- 【回答框架 4】虚函数表的存储通常位于只读数据段,每个类共享一份。多重继承时,对象可能包含多个vptr,分别对应不同基类。
- 【回答框架 5】虚函数机制带来一定的空间和时间开销(每个对象增加一个指针,调用需要间接跳转),但这是实现多态的必要代价。
- 【关键点 1】虚函数通过vptr和vtable实现动态绑定。
- 【关键点 2】vptr在构造时被设置。
- 【关键点 3】虚函数调用通过vptr间接查找,实现运行时多态。
- 【关键点 4】析构函数建议声明为虚函数以正确释放派生类资源。
- 【易错点 1】构造函数中调用虚函数不会触发多态,因为vptr尚未完全设置。
- 【易错点 2】vtable是类级别的,不是对象级别的,不要误以为每个对象都有自己的虚函数表。