指向虚函数的指针与指向非虚函数的指针有何不同?

时间:2013-08-10 15:28:08

标签: c++ function pointers virtual

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

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

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

3 个答案:

答案 0 :(得分:1)

普通函数只能用其地址调用,因此指向普通函数的指针只是一个地址。

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

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

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

有些编译器提供了另一种选择,如果你保证绝对肯定,从不在指针中存储指向虚函数的指针,编译器将生成一个更小的指针表示,你'当你违背这个承诺时,我会发现你遇到了麻烦。

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

答案 1 :(得分:0)

&安培;是运营商的地址。在C语言中,可以简单地指定函数的名称,在C ++中,您应该使用完全限定的函数名称。

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

答案 2 :(得分:0)

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

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

该标准要求'&'运算符,虽然我使用了不需要它的编译器。