一组功能指针分组 经常进入数据结构 称为虚函数 表(VFT)。
以上陈述让我觉得virtual function == function pointer
是这样的吗?
答案 0 :(得分:5)
C中没有对虚拟功能的内置支持。
在C ++中,虚拟函数是通过v-table指定的。并且vtable中的条目可以实现为函数指针。
答案 1 :(得分:2)
这是错误的,因为这些是不同的抽象层次。
类比可能会有所帮助:说虚拟功能和功能指针完全相同就像说轮子和自行车是相同的。
虽然功能指针和虚函数在“引擎盖下”看起来大致相同,但它们是不同的东西 - 在概念上(虚函数是类的一个过度成员方法,而函数指针只是一个间接)一个函数)和语法(调用它们完全不同)。
然而,它们可能起到同样的作用。特别是,两者都提供了一种延迟调用决策的方法( 函数在这种情况下调用?)直到运行时正常调用在编译时发生。答案 2 :(得分:1)
我会说接近但不完全。虚函数仍然是一个函数,但它通常通过指针调用,而不是直接调用。
答案 3 :(得分:1)
是的,虚函数表通常作为函数指针表实现。但是,还有其他硬件与指针表一起使这些函数实际上是“虚拟的”。你必须有一个机制来在运行时将调用绑定到正确的指针等等。我这样说是因为认为虚拟函数是最基本级别的函数指针是错误的任何函数指针都是虚函数。
答案 4 :(得分:1)
实际上C ++支持虚函数,但C不支持VF,因为两者都是完全不同的概念
答案 5 :(得分:1)
虚函数是一个用关键字virtual
声明的函数(立即或在其中一个基类中)。就是这样。
现在,可以解析对虚拟功能的调用静态或动态。动态解析的调用是根据调用中使用的对象的 dynamic 类型解析的调用。就是这样。
上面没有任何内容可以引用任何“函数指针”。但是,在典型的实现中,为了实现动态调用的正确行为,使用具有函数指针(指向虚函数)的表。该表格被称为“VMT”,“VFT”或“vtable”。
换句话说,函数指针是一个实现细节,通常用于为虚拟函数的动态调用提供支持。
为了进一步说明,请注意,例如,即使某个函数是虚拟的,但它永远不会被称为动态,那么就不需要为该函数生成任何“指针”。出于这个原因,一些编译器不为抽象类生成VMT,因为即使这些类具有虚函数,也不会动态调用这些函数。
答案 6 :(得分:0)
我猜这是来自了解Linux网络内部的书 - 我们在这里谈论C,你的括号错了 - 它是virtual (function table)
,而不是(virtual function) table
:)。虚函数是仅限C ++的术语。
不意味着您无法编码OOP in ANSI C ...