9

vtable 包含指向该类的虚函数的指针。它是否还包含指向非虚拟函数的指针?

谢谢!

4

4 回答 4

11

这是一个实现细节,但不是。如果实现将指向非虚拟函数的指针放入 vtable 中,则它不能使用这些指针进行函数调用,因为它通常会导致调用不正确的非虚拟函数。

当调用非虚拟函数时,实现必须使用调用函数的对象的静态类型来确定要调用的正确函数。由vptr访问的存储在vtable中的函数将取决于对象的动态类型,而不是任何静态类型的引用或访问它的指针。

于 2012-09-30T12:41:09.603 回答
4

不,它没有。

由于可以在编译期间解析对非虚方法的调用(因为编译器知道非虚函数的地址),所以编译器生成指令以“直接”(即静态地)调用它们。

对于编译期间已知的方法,没有理由通过 vtable 间接机制。

于 2012-09-30T12:41:26.670 回答
2

标准没有定义任何实现是否使用“vtable”。大多数实现使用函数指针表,尽管指向的函数通常不是直接被调用的函数(相反,指向的函数可以在调用实际函数之前调整指针)。

非虚函数是否出现在此表中也没有标准定义。毕竟,标准甚至不需要 vtable 的存在。通常,非虚函数不在虚函数表中,因为任何必要的指针调整和调用都可以在编译或链接时解决。我可以想象一个实现类似地处理所有函数,因此在所有情况下都使用虚函数表中的指针。我不需要很受欢迎。然而,在与更灵活的对象系统无缝交互的环境中实现 C++ 可能是一种好方法,例如,可以在运行时替换单个函数的语言(我的理解是这样的事情是可能的,例如,在python中)。

于 2012-09-30T12:46:12.830 回答
1

No. A vtable only contains pointers to virtual functions in the same class or file.

于 2014-02-27T18:03:26.960 回答