1

为什么在下一段代码中需要在函数之前使用“&”?

void (Mammal::*pFunc) () const=0;
pFunc=&Mammal::Move;

Move() 是基本类中的虚函数,pFunc 是指向此类中虚函数的指针。那么为什么我们需要使用“&”呢?根据虚函数的一些特殊性质?或者它只是语法?

4

3 回答 3

1

一个普通函数可以只用它的地址来调用,所以指向一个普通函数的指针就是一个地址。

也可以仅使用其地址调用非虚拟函数(当然还有this指针,通过编译器使用的任何机制传递),因此指向非虚拟函数的指针可能只是一个地址。

必须通过编译器特定的机制来查找虚函数(通常是一个虚表,在对象中的已知偏移处;函数的地址是通过索引表找到的),并且指向虚函数的指针必须包含确定要调用的实际函数是什么所需的任何信息,具体取决于对象的实际类型。

但是指向成员函数的指针必须能够处理函数和非虚函数,因此它有足够的空间为两者设置正确的机制,并且运行时调用将检查存储的数据以确定要做什么。

一些编译器提供了另一种选择,如果你保证绝对、肯定地永远不会在指针中存储指向虚函数的指针,编译器会生成一个更小的指针表示,然后你会发现你有麻烦了你违背了这个承诺。

至于为什么&需要,它是必需的。微软早期的 C++ 编译器不需要&(也不需要类名;如果你省略它,你会得到一个指向当前对象类的成员函数的指针);他们谈到提议取消该规则,但没有得到任何结果。

于 2013-08-10T15:50:05.313 回答
0

& 是操作符的地址。虽然在 C 中可以简单地指定函数的名称而不使用它,但在 C++ 中,您应该将它与完全限定的函数名称一起使用。

如果我没记错的话,当你获取一个虚函数的地址时,编译器实际上会生成一个中间函数,然后使用它的地址来代替。当调用该中间函数时,它所要做的就是调用您指定的虚函数。

于 2013-08-10T15:46:40.630 回答
0

在您的第一行中,pFunc 不是指向虚函数的指针,而是指向 Mammal 中不带参数并返回 void 的 const 方法的指针。然后,您将 0 分配给该指针。

'&' 运算符为您提供类范围内的 Mammal::Move 方法的地址,适合分配给成员函数指针。

该标准需要“&”运算符,尽管我使用了不需要它的编译器。

于 2013-08-10T15:48:30.233 回答