面试题答案
一键面试- 虚函数表的数量:
- 由于
D
多重继承自B
和C
,而B
和C
又继承自含有虚函数的A
类,D
类对象会有两个虚函数表。这是因为在多重继承中,为了支持从不同基类的角度正确调用虚函数,每个直接基类(这里是B
和C
)都需要有自己独立的虚函数表指针,指向对应的虚函数表。
- 由于
- 每个虚函数表的内容:
- 第一个虚函数表(与
B
相关):- 该虚函数表中首先会包含
A
类的虚函数(如果B
没有重写,就使用A
类虚函数的地址;如果B
重写了,就使用B
类重写后的虚函数地址)。 - 然后会包含
B
类自己新增的虚函数(如果有)。
- 该虚函数表中首先会包含
- 第二个虚函数表(与
C
相关):- 同样,该虚函数表会先包含
A
类的虚函数(处理方式同B
类虚函数表中对A
类虚函数的处理)。 - 接着包含
C
类自己新增的虚函数(如果有)。
- 同样,该虚函数表会先包含
- 第一个虚函数表(与
- 与基类虚函数表的关系:
D
类对象中的两个虚函数表与A
类虚函数表密切相关。它们都从A
类虚函数表继承内容。对于A
类的虚函数,在B
和C
继承时可能会有重写操作,所以D
类的两个虚函数表中A
类虚函数部分可能与A
类虚函数表有所不同(取决于B
和C
是否重写)。而B
和C
各自新增的虚函数则是对虚函数表的扩展,是A
类虚函数表所没有的。
- 运行时虚函数调用:
- 在运行时,当通过
D
类对象或指向D
类对象的指针、引用调用虚函数时,编译器会根据对象的类型信息(通常通过RTTI
,运行时类型识别)和调用虚函数的上下文(即从哪个基类的角度调用)来确定使用哪个虚函数表。 - 例如,如果通过
D
类对象以B
类的视角调用虚函数,就会使用与B
相关的虚函数表。编译器会根据虚函数表指针找到对应的虚函数表,然后在虚函数表中根据虚函数的索引找到正确的虚函数地址并调用。同样,如果以C
类的视角调用虚函数,就会使用与C
相关的虚函数表进行查找和调用。这样就能在复杂的多重继承关系下准确调用正确的虚函数。
- 在运行时,当通过