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

use*_*er7 13 c++ virtual vtable

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

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

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

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

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

Dav*_*eas 23

在非纯虚函数的情况下,vtable中的每个条目将引用最终覆盖或者在需要时调整指针的thunkthis.在纯虚函数的情况下,vtable中的条目通常包含指向泛型函数的指针,该函数使用一些合理的消息(在此上下文中调用的纯虚函数或类似的错误消息)来抱怨和中止程序.

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

是的,它会,存储在表中的内容不同,而不是表的形状.在一种简单的方法中,纯虚函数的NULL指针,虚函数的非NULL.实际上,指向一个普通函数的指针,它将abort()与普通的编译器一起抱怨 .

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

这不会影响vtable.V表只用于动态调度和通话将永远不会被动态分派到一个纯虚函数的定义(即你只能手动通过禁用动态调度出线类型的名称分派给纯虚函数:x.base::f()将调用base::f即使它是纯虚拟的,但如果它是纯虚拟的,x.f()也永远不会被分派base::f.