这只是一些实现上的细节,但并不会这样做。如果一个实现将非虚函数的指针放入 vtable 中,那么它不能使用这些指针进行函数调用,因为这通常会导致调用错误的非虚函数。 当调用非虚函数时,实现必须使用正在调用该函数的对象的静态类型来确定正确的函数调用。存储在通过 vptr 访问的 vtable 中的函数将依赖于对象的动态类型,而不是任何通过它进行访问的引用或指针的静态类型。
标准并未定义任何实现是否使用“虚函数表”(vtable)。大多数实现使用一个函数指针表,尽管所指向的函数通常不是直接被调用的(相反,在调用实际函数之前,所指向的函数可能会调整指针)。非虚函数是否出现在此表中也没有被标准定义。毕竟,标准甚至不要求存在虚函数表。通常情况下,非虚函数不在虚函数表中,因为任何必要的指针调整和调用可以在编译或链接时解决。我可以想象一种实现方式以相似的方式处理所有函数,并在所有情况下使用虚函数表中的指针。然而,这可能不会得到广泛的认可。但是,在与更灵活的对象系统无缝交互的环境中实现C++可能是一种好方法,例如可以在运行时替换单个函数的语言中(我的理解是Python中可能存在这样的情况)。