面试题答案
一键面试虚函数表基本结构
- 概念:虚函数表是一个存储虚函数地址的数组,每个包含虚函数的类都有一个对应的虚函数表。当类中定义了虚函数时,编译器会为该类生成一个虚函数表。
- 组成:虚函数表中的每一项是一个指向虚函数的指针。对于基类,虚函数表包含基类中定义的虚函数的地址。如果派生类覆盖了基类的虚函数,那么在派生类的虚函数表中,被覆盖的虚函数的条目将被替换为派生类中该虚函数的地址;如果派生类没有覆盖某个虚函数,那么派生类虚函数表中该虚函数条目和基类虚函数表中该虚函数条目指向相同的函数地址。同时,每个对象都有一个虚函数表指针(vptr),该指针指向该对象所属类的虚函数表。
多态性体现
- 创建对象及指针指向:当创建一个
B
类对象并通过基类指针A* ptr = new B();
指向它时,ptr
所指向对象的虚函数表指针vptr
指向B
类的虚函数表。 - 调用虚函数:当通过
ptr
调用虚函数时,例如ptr->virtualFunction();
,程序运行时会首先根据ptr
中的虚函数表指针找到B
类的虚函数表,然后在虚函数表中找到被调用虚函数的地址,并执行该函数。由于B
类覆盖了基类A
的虚函数,此时执行的是B
类中覆盖后的虚函数,而不是A
类中的虚函数,这就体现了多态性。从虚函数表输出内容来看,在B
类虚函数表中,被覆盖虚函数的条目是B
类中该虚函数的地址,而不是A
类中虚函数的地址,使得通过基类指针调用虚函数时能根据对象实际类型(这里是B
类)调用到正确的函数实现,从而实现多态。