c ++:vtable是否包含指向非虚函数的指针?

时间:2012-09-30 12:38:41

标签: c++ virtual vtable

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

THX!

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

不,它没有。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

没有。 vtable仅包含指向同一类或文件中的虚函数的指针。