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

时间:2016-06-21 12:13:26

标签: c++ late-binding

我读了一个关于多态的例子,它看起来像是下面的,其中show()是一个虚函数:

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

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

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

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

1 个答案:

答案 0 :(得分:8)

  

但是,在这个例子中,我们(也可能是编译器)可以看到应该调用哪个函数,因为ptr指向的对象没有变化。

正确。

  

那么为什么不在这种情况下进行早期绑定,因为后期绑定会导致一些开销?

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

后期绑定只是意味着调用将解析为最派生的覆盖(直到对象的具体类型) - 而不是解析对Base::show的调用。

当然,一般来说,后期绑定可能需要动态调度,但如果程序的行为与遵循规则的行为相同,则允许实现违反规则。这称为as-if规则。并且由于您也做了观察,更改程序以进行静态调度不会改变行为,因此允许编译器进行优化并避免进行动态调度。