为什么我们不对非虚函数使用相同的方法?
我的意思是,为什么我们以这种方式使用虚拟功能?我们不能只将它们用作非虚拟的并覆盖它们吗?
如果这种方法为我们节省了时间/空间或者什么,我们为什么不对非虚函数使用相同的方法呢?我的意思是,有一个特定类的函数表会有意义。
无论如何,提前谢谢,我有点困惑。
答案 0 :(得分:6)
如果不使用间接级别,则不能具有运行时多态性。这就是vptr的用途。
vptr不用于非多态函数,因为间接成本有所欠缺。 C ++哲学是你不为你不使用的东西买单。
编辑:
以下是有关虚拟表如何工作的一些信息:http://en.wikipedia.org/wiki/Virtual_table
答案 1 :(得分:2)
编译器本质上生成对非虚方法的直接调用。通过虚方法调用,编译器生成代码以查找方法的地址,然后调用该地址。因此,理论上,在调用虚函数时至少再查找一次。否则就没有理由承担这笔费用。
答案 2 :(得分:2)
使用vptr允许基于对象类型而不是变量类型的方法解析。不使用vptr会使方法调用更快。 C ++设计者决定允许虚拟功能的便利,但不要求其他功能的性能损失。