C ++访谈:具有纯虚函数的类的vtable

时间:2011-10-03 14:15:13

标签: c++ virtual vtable

我今天被问到这个面试问题!! (这是一个非常尴尬的电话采访..):

  

具有虚拟的类的vtable有什么区别   函数和具有纯虚函数的类?

现在,我知道C ++标准没有指定关于vtable的任何内容,甚至没有指定v-table的存在......从理论上讲,答案是什么?

我脱口而出,具有纯虚函数的类可以具有vtable,并且其纯虚函数的vtable条目将指向派生类实现。这个假设是否正确?我没有得到面试官的肯定答复。

假设的编译器是否会为仅具有纯虚函数的类创建vtable?如果类包含带定义的纯虚函数怎么办? (如:http://www.gotw.ca/gotw/031.htm所示)。

3 个答案:

答案 0 :(得分:23)

对于非纯虚函数,vtable中的每个条目都将引用适应this final-overrider thunk 指针,如果需要。在纯虚函数的情况下,vtable中的条目通常包含一个指向泛型函数的指针,该函数使用一些合理的消息来抱怨和中止程序(在此内部调用的纯虚函数上下文或类似的错误消息)。

  

假设的编译器是否会为仅具有纯虚函数的类创建vtable?

是的,它会,存储在表中的内容不同,而不是表的形状。在一种简单的方法中,纯虚函数的NULL指针,虚函数的非NULL。实际上,指向一个通用函数的指针,它将通过常规编译器进行抱怨和abort()

  

如果类包含带定义的纯虚函数怎么办?

这不会影响vtable。 vtable仅用于动态调度,并且永远不会将调用动态调度到纯虚函数的定义(即,您只能通过禁用动态调度来限定类型名称来手动调度到纯虚函数:{{ 1}}即使它是 pure-virtual ,也会调用x.base::f(),但如果它是纯虚拟的话,base::f永远不会被调度到x.f()

答案 1 :(得分:0)

我可以告诉你,Microsoft(和MS VC ++)使用“纯”抽象类(只有纯虚函数的类)作为COM接口。也许他说的是这个。 COM的“内部”表示是指向vtable的指针。 MS VC ++中的纯抽象类以相同的方式实现,因此您可以使用它们来表示COM对象。显然,如果你的类有其他虚函数,你不能简单地用COM vtable覆盖它的vtable: - )

答案 2 :(得分:0)

在这种情况下,实现几乎可以做任何事情,因为如果 您的代码最终在上下文中调用纯虚函数 需要动态分辨率,它将解析为纯虚拟 功能,行为未定义。我见过几个不同的 解决方案:编译器插入一个函数的地址 以错误消息终止(来自a的首选解决方案) 从实现质量的角度来看,编译器插入一个null 指针,或编译器从某些插入函数的地址 派生类。我也看到了编译器将插入的情况 如果提供实现,则为函数的地址。唯一的 问题的正确答案是你不能指望任何特定的 行为。