我读了一个关于多态的例子,它看起来像是下面的,其中show()是一个虚函数:
int main()
{
Derived dv1;
Derived dv2;
Base* ptr;
ptr = &dv1;
ptr->show();
ptr = &dv2;
ptr->show();
}
书中说,在这种情况下,编译器将使用late binding
技术。我确实理解后期绑定和早期绑定之间的区别。但是,在这个例子中,我们(也可能是编译器)可以看到应调用哪个函数,因为ptr
指向的对象没有变化。那么为什么不在这种情况下进行早期绑定,因为后期绑定会导致一些开销?
答案 0 :(得分:8)
但是,在这个例子中,我们(也可能是编译器)可以看到应该调用哪个函数,因为ptr指向的对象没有变化。
正确。
那么为什么不在这种情况下进行早期绑定,因为后期绑定会导致一些开销?
通过指向多态类型的指针调用该函数,因此使用后期绑定。
后期绑定只是意味着调用将解析为最派生的覆盖(直到对象的具体类型) - 而不是解析对Base::show
的调用。
当然,一般来说,后期绑定可能需要动态调度,但如果程序的行为与遵循规则的行为相同,则允许实现违反规则。这称为as-if规则。并且由于您也做了观察,更改程序以进行静态调度不会改变行为,因此允许编译器进行优化并避免进行动态调度。