后期绑定仅在虚函数中发生,并且仅当您使用存在这些虚函数的基类的地址时才会发生。
这是一本着名教科书的摘录。
我的问题是......作者究竟是什么意思'使用地址'?
答案 0 :(得分:1)
相关场景是指具有静态类型指针到Base或reference-to-Base的指针或引用,无论指针或引用是局部变量,函数参数,成员变量等..
// accessed via pointer...
Base* p = new Derived(); p->fn(); // (ref.1)
void f(Base* p) { p->fn(); } Derived d; f(&d);
// accessed via reference...
const Base& r = static_derived;
void f(Base& b) { b.fn(); } Derived d; f(d);
后期绑定仅在虚函数中发生,并且仅在您使用存在这些虚函数的基类的地址时才会发生。
该陈述在两个方面具有误导性:
后期绑定可能在指定的情况下发生,但是如果可以计算出所涉及的动态类型,则允许优化器在编译或链接时绑定。例如,如果上面(ref.1)中的两行代码一起出现在函数体中,编译器就可以看出p
对Derived
个对象进行了解析,并将调用直接硬编码到任何{{1}覆盖,或者使基类实现失败。
上述情况涉及指针和参考。就C ++标准而言,用于实现引用的机制未被指定,我们谦虚的程序员不应该假设它们是有效的指针使用不同的符号,所以我们不应该考虑它们存储“地址”他们引用的变量,但将它们视为存储地址的美化指针通常是实用的,引用的语句将它们作为“使用地址”的机制将它们集中在一起。
答案 1 :(得分:0)
我想重点不在于使用地址,因为引用也会这样做,这是错误的。相反,重点是地址或引用的静态类型是那些存在这些虚函数的基类的类型#34;。当你有多个基类或者基类有一个基类本身,其中有问题的成员函数不存在时,情况并非总是如此。