这在虚拟功能中意味着什么?

时间:2015-04-02 05:49:09

标签: c++

  

后期绑定仅在虚函数中发生,并且仅当您使用存在这些虚函数的基类的地址时才会发生。

这是一本着名教科书的摘录。

我的问题是......作者究竟是什么意思'使用地址'?

2 个答案:

答案 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)中的两行代码一起出现在函数体中,编译器就可以看出pDerived个对象进行了解析,并将调用直接硬编码到任何{{1}覆盖,或者使基类实现失败。

  • 上述情况涉及指针和参考。就C ++标准而言,用于实现引用的机制未被指定,我们谦虚的程序员不应该假设它们是有效的指针使用不同的符号,所以我们不应该考虑它们存储“地址”他们引用的变量,但将它们视为存储地址的美化指针通常是实用的,引用的语句将它们作为“使用地址”的机制将它们集中在一起。

答案 1 :(得分:0)

我想重点不在于使用地址,因为引用也会这样做,这是错误的。相反,重点是地址或引用的静态类型是那些存在这些虚函数的基类的类型#34;。当你有多个基类或者基类有一个基类本身,其中有问题的成员函数不存在时,情况并非总是如此。