Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向虚拟函数的指针与指向非虚拟函数的指针有何不同?_C++_Function_Pointers_Virtual - Fatal编程技术网

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

C++ 指向虚拟函数的指针与指向非虚拟函数的指针有何不同?,c++,function,pointers,virtual,C++,Function,Pointers,Virtual,为什么在下一段代码中需要在函数之前使用“&” void (Mammal::*pFunc) () const=0; pFunc=&Mammal::Move; Move()是基本类中的虚拟函数,pFunc是指向该类中虚拟函数的指针。 那么为什么我们需要使用“&”?根据虚函数的一些特殊性质? 还是仅仅是语法 &是操作员的地址。在C中,可以简单地指定函数的名称,而不需要在C++中使用它。 如果我没记错的话,当你获取一个虚函数的地址时,编译器实际上会生成一个中间函数,然后用它的地址来代替。调用该

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

void (Mammal::*pFunc) () const=0;
pFunc=&Mammal::Move;
Move()是基本类中的虚拟函数,pFunc是指向该类中虚拟函数的指针。 那么为什么我们需要使用“&”?根据虚函数的一些特殊性质?
还是仅仅是语法

&是操作员的地址。在C中,可以简单地指定函数的名称,而不需要在C++中使用它。
如果我没记错的话,当你获取一个虚函数的地址时,编译器实际上会生成一个中间函数,然后用它的地址来代替。调用该中间函数时,它所做的就是调用您指定的虚拟函数。

&是运算符的地址。在C中,可以简单地指定函数的名称,而不需要在C++中使用它。
如果我没记错的话,当你获取一个虚函数的地址时,编译器实际上会生成一个中间函数,然后用它的地址来代替。调用该中间函数时,它所做的只是调用您指定的虚拟函数。

在第一行中,pFunc不是指向虚拟函数的指针,而是指向哺乳动物中不带参数并返回void的const方法的指针。然后将0指定给该指针

“&”运算符为您提供类作用域中哺乳动物::Move方法的地址,适合分配给成员函数指针


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

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

“&”运算符为您提供类作用域中哺乳动物::Move方法的地址,适合分配给成员函数指针


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

普通函数可以仅用其地址调用,因此指向普通函数的指针就是一个地址

非虚拟函数也可以仅使用其地址(当然,加上
this
指针,由编译器使用的任何机制传递),因此指向非虚拟函数的指针可以只是一个地址

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

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

有些编译器提供了另一种选择,如果您承诺绝对地、肯定地,从不在指针中存储指向虚拟函数的指针,编译器将生成较小的指针表示形式,并且您会发现,当您违反该承诺时,您会遇到麻烦


至于为什么需要
&
,它是必需的。微软早期的C++编译器不需要<代码>和代码>(并且不需要类名;如果你把它放在外面,你就可以得到指向当前对象类成员函数的指针);他们谈到建议取消该规则,但没有取得任何进展。

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

非虚拟函数也可以仅使用其地址(当然,加上
this
指针,由编译器使用的任何机制传递),因此指向非虚拟函数的指针可以只是一个地址

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

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

有些编译器提供了另一种选择,如果您承诺绝对地、肯定地,从不在指针中存储指向虚拟函数的指针,编译器将生成较小的指针表示形式,并且您会发现,当您违反该承诺时,您会遇到麻烦


至于为什么需要
&
,它是必需的。微软早期的C++编译器不需要<代码>和代码>(并且不需要类名;如果你把它放在外面,你就可以得到指向当前对象类成员函数的指针);他们谈到建议取消该规则,但没有取得任何进展。

使用成员函数指针通常不会有好的结果。我们需要使用
&
,因为标准是这样规定的。指向虚拟函数的指针和指向非虚拟成员函数的指针在语法上没有区别。它们在后台的实现方式不同,但程序员不应该看到这一点。使用指向成员函数的指针通常不会有好的结果,我们需要使用
&
,因为标准上是这么说的。没有syntac