0

在 S. Lippman 撰写的“C++ 对象模块内部”的第 26 页上,您会发现以下代码段:

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()将始终通过静态调用调用。为什么编译器会在这里使用虚拟调用?

4

1 回答 1

0

即使没有必要,编译器也可以选择使用虚拟调用。该标准没有说编译器“必须”将其转换为静态调用。只要调用了“正确”的函数,编译器就完成了它的工作。

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

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

于 2013-05-04T18:49:24.620 回答