5

组合成数据结构的一组函数指针通常称为虚拟函数表 (VFT)。

上面的说法让我觉得virtual function == function pointer,是这样吗?

4

7 回答 7

5

C 中没有对虚函数的内置支持。

在 C++ 中,虚函数是通过v-table指定的。并且 vtable 中的条目可以实现为函数指针。

于 2010-05-23T12:43:37.373 回答
2

这是错误的,因为这些是不同的抽象级别。

一个类比可能会有所帮助:说虚函数和函数指针是相同的,就像说车轮和自行车是相同的。

虽然函数指针和虚函数在“底层”看起来很相似,但它们是不同的东西——两者在概念上都是不同的(虚函数是类的可覆盖成员方法,而函数指针只是函数的间接引用) ) 和语法上(调用它们是完全不同的)。

但是,它们可能具有相同的目的。特别是,两者都提供了一种将调用决策(在这种情况下调用哪个函数?)推迟到运行时的方法,此时正常的调用调度发生在编译时。

于 2010-05-23T12:47:55.493 回答
1

是的,虚函数表通常在底层实现为函数指针表。但是,还有其他硬件可以与指针表一起使用,以使功能实际上是“虚拟的”。您必须有一种机制来在运行时将调用绑定到正确的指针等。我这么说是因为认为虚函数是最基本的函数指针是错误的,这使得任何函数指针都是虚函数。

于 2010-05-23T13:02:37.393 回答
1

根据定义,C++ 中的虚函数是用关键字声明的函数virtual(立即或在基类之一中)。就这样。

现在,可以静态动态地解析对虚函数的调用。动态解析调用是根据调用中使用的对象的动态类型解析的调用。就这样。

上面的任何内容都没有引用任何“函数指针”。然而,在一个典型的实现中,为了实现动态调用的正确行为,使用了一个带有函数指针(指向虚函数)的表。该表就是所谓的“VMT”、“VFT”或“vtable”。

换句话说,函数指针是一个实现细节,通常用于为虚拟函数的动态调用提供支持。

为了进一步说明这一点,请注意,例如,即使某个函数是虚拟的,但它从未被动态调用,那么也不需要为该函数生成任何“指针”。出于这个原因,一些编译器不会为抽象类生成 VMT,因为即使这些类具有虚函数,这些函数也不会被动态调用。

于 2010-05-23T17:14:39.867 回答
1

我会说接近,但不完全。虚函数仍然是一个函数,但它通常通过指针调用,而不是直接调用。

于 2010-05-23T12:43:12.270 回答
1

实际上 C++ 支持 Virtual Functions ,但 C 不支持 VF 因为两者是完全不同的概念

于 2010-05-23T13:56:49.083 回答
0

我猜它来自《Understanding Linux Network Internals》一书——我们在这里讨论的是 C,而你的括号弄错了——它是virtual (function table),不是(virtual function) table:)。虚函数是 C++ 唯一的术语。

并不意味着您不能在 ANSI C 中编写 OOP ...

于 2010-05-23T12:49:20.383 回答