C ++:难道一个虚函数表包含指向非虚函数?(c++: Does a vtable contains

2019-08-01 01:33发布

虚函数表包含指向这个类的虚函数。 它也包含指向非虚函数呢?

谢谢!

Answer 1:

这是一个实现细节,但没有。 如果实现把指针非虚函数为虚函数表就不能使用这些指针作出的函数调用,因为这往往会导致不正确的非虚拟函数被调用。

当非虚函数被调用的实现必须使用静态类型上的函数被调用,以确定正确的函数调用的对象。 存储在由一个的vptr访问的虚表阿功能将依赖于动态型的对象,而不是任何静态类型,通过它正在访问的引用或指针的。



Answer 2:

不,没有。

至于非虚方法调用可以在编译过程中解决(因为编译器知道非虚函数的地址),编译器生成指令“直接”打电话给他们(即静态)。

我们没有理由去通过虚表间接机制,这是在编译过程中已知的方法。



Answer 3:

是否不是“虚函数表”用于通过任何实现并不由标准限定。 大多数的实现使用函数指针表虽然功能指向通常不是直接的那些被称为(相反,所指向的函数调用实际的函数之前可以调节指针)。

无论是否非虚函数在该表中显示也不受标准定义。 毕竟,标准甚至不需要一个虚函数表的存在。 通常情况下,非虚拟函数不是一个虚函数表,因为任何必要的指针调整和呼叫可以在编译期或链接时得到解决。 我能想象一个实施治疗的所有功能类似,因此,在所有情况下使用指针的虚函数表。 我就没有必要很受欢迎。 然而,这可能是实现C ++环境中的一个很好的方式它无缝地与更为灵活的对象系统进行交互,例如,在各个功能可以在运行时被替换语言(我的理解是,这样的事情是可能的,例如,在python)。



Answer 4:

号V表仅包含指向在同一类或文件虚函数。



文章来源: c++: Does a vtable contains pointers to non-virtual functions?