为什么我们甚至需要VPTR?

时间:2010-12-20 17:27:46

标签: c++ vptr

为什么我们不对非虚函数使用相同的方法?

我的意思是,为什么我们以这种方式使用虚拟功能?我们不能只将它们用作非虚拟的并覆盖它们吗?

如果这种方法为我们节省了时间/空间或者什么,我们为什么不对非虚函数使用相同的方法呢?我的意思是,有一个特定类的函数表会有意义。

无论如何,提前谢谢,我有点困惑。

3 个答案:

答案 0 :(得分:6)

如果不使用间接级别,则不能具有运行时多态性。这就是vptr的用途。

vptr不用于非多态函数,因为间接成本有所欠缺。 C ++哲学是你不为你不使用的东西买单。

编辑:

以下是有关虚拟表如何工作的一些信息:http://en.wikipedia.org/wiki/Virtual_table

答案 1 :(得分:2)

编译器本质上生成对非虚方法的直接调用。通过虚方法调用,编译器生成代码以查找方法的地址,然后调用该地址。因此,理论上,在调用虚函数时至少再查找一次。否则就没有理由承担这笔费用。

答案 2 :(得分:2)

使用vptr允许基于对象类型而不是变量类型的方法解析。不使用vptr会使方法调用更快。 C ++设计者决定允许虚拟功能的便利,但不要求其他功能的性能损失。