为什么不尽可能使用早期绑定?

Why not use early binding when possible?

我读了一个关于多态性的例子,如下所示,其中 show() 是一个虚函数:

int main()
{
  Derived dv1;
  Derived dv2;
  Base* ptr;

  ptr = &dv1;
  ptr->show();

  ptr = &dv2;
  ptr->show();
}

书上说在这种情况下,编译器将使用 late binding 技术。我确实了解后期绑定和早期绑定之间的区别。然而,在这个例子中,我们(也许还有编译器)可以看到应该调用哪个函数,因为 ptr 指向的对象没有变化。那么为什么不在这种情况下提前绑定,因为后期绑定会导致一些开销?

However, in this example, we (and maybe the compiler as well) can see that which function should be called because there's no change in the objects that ptr points to.

正确。

So why not early binding in this case because late binding will cause some overhead?

该函数是通过指向多态类型的指针调用的,因此使用了后期绑定。

后期绑定仅仅意味着调用将解析为最派生的覆盖(向下到对象的具体类型)——而不是解析对 Base::show.

的调用

当然,一般情况下后期绑定可能需要动态调度,但如果程序仍然表现得像遵守规则一样,则允许实现违反规则。这被称为 as-if 规则。并且由于您也进行了观察,将程序更改为进行静态分派不会改变行为,因此允许编译器进行优化并避免进行动态分派。