为什么编译器会对下面的`datum :: rotate()`使用虚拟调用?

时间:2013-05-04 18:43:08

标签: c++ polymorphism

在" C ++对象模块内部的第26页"通过S. Lippman,您将找到以下代码段:

void rotate(
X datum,
const X *pointer,
const X &reference )
{
    // cannot determine until run-time
    // actual instance of rotate() invoked
    (*pointer).rotate();
    reference.rotate();
    // always invokes X::rotate()
    datum.rotate();
}
main() {
    Z z; // a subtype of X
    rotate( z, &z, z );
    return 0;
}

和本段:

The two invocations through pointer and reference are resolved dynamically. In this example, they both invoke Z::rotate(). The invocation through datum may or may not be invoked through the virtual mechanism; however, it will always invoke X::rotate().

AFAIK,datum.rotate()将始终使用静态调用进行调用。为什么编译器会在这里使用虚拟调用?

1 个答案:

答案 0 :(得分:0)

编译器可以选择使用虚拟调用,即使不需要这样做。该标准并未说编译器“必须”将其转换为静态调用。只要调用“右”函数,编译器就完成了它的工作。

编辑:似乎标准(至少n3337)没有确切地说出编译器应该如何被调用 - 它基本上就是说

  

注意:虚函数调用的解释取决于它所对象的类型   调用(动态类型),而非虚拟成员函数的调用的解释取决于   仅表示该对象的指针或引用的类型(静态类型)(5.2.2)。 - 结束说明