【发布时间】:2010-05-23 12:40:06
【问题描述】:
一组分组的函数指针 进入数据结构通常是 称为虚函数 表 (VFT)。
上面的说法让我觉得virtual function == function pointer,是这样吗?
【问题讨论】:
标签: c syntax virtual-functions
一组分组的函数指针 进入数据结构通常是 称为虚函数 表 (VFT)。
上面的说法让我觉得virtual function == function pointer,是这样吗?
【问题讨论】:
标签: c syntax virtual-functions
C 中没有对虚函数的内置支持。
在 C++ 中,虚函数是通过 v-table 指定的。并且 vtable 中的条目可以实现为函数指针。
【讨论】:
这是错误的,因为它们是不同的抽象级别。
一个类比可能会有所帮助:说虚函数和函数指针是相同的,就像说车轮和自行车是相同的。
虽然函数指针和虚函数在“底层”看起来很相似,但它们是不同的东西——两者在概念上(虚函数是类的可覆盖成员方法,而函数指针只是间接函数)和语法(调用它们是完全不同的)。
但是,它们可能具有相同的目的。特别是,两者都提供了一种将调用决策(在这种情况下调用哪个函数?)推迟到运行时的方法,此时正常的调用调度发生在编译时。
【讨论】:
我会说接近,但不完全。虚函数仍然是函数,但通常是通过指针调用,而不是直接调用。
【讨论】:
是的,虚函数表通常在底层实现为函数指针表。但是,还有其他硬件可以与指针表一起使用,以使功能实际上是“虚拟的”。您必须有一种机制来在运行时将调用绑定到正确的指针等。我这样说是因为认为虚函数是最基本的函数指针是错误的,这使得任何函数指针都是虚函数。
【讨论】:
其实C++支持虚函数,但是C不支持VF,因为两者是完全不同的概念
【讨论】:
Virtual function 在 C++ 中的定义是使用关键字 virtual 声明的函数(立即或在基类之一中)。就是这样。
现在,可以静态地或动态地解决对虚函数的调用。动态解析调用是根据调用中使用的对象的动态类型解析的调用。就是这样。
以上内容均未引用任何“函数指针”。然而,在一个典型的实现中,为了实现动态调用的正确行为,使用了一个带有函数指针(指向虚函数)的表。这个表就是所谓的“VMT”、“VFT”或“vtable”。
换句话说,函数指针是一种实现细节,通常用于为动态对虚拟函数的调用提供支持。
为了进一步说明这一点,请注意,例如,即使某个函数是虚拟的,但它从未被动态调用,那么也不需要为该函数生成任何“指针”。由于这个原因,一些编译器不会为抽象类生成 VMT,因为即使这些类具有虚函数,这些函数也不会被动态调用。
【讨论】:
我猜它来自《Understanding Linux Network Internals》一书——我们在这里讨论的是 C,而你的括号弄错了——它是 virtual (function table),而不是 (virtual function) table :)。虚函数是 C++ 唯一的术语。
这不意味着你不能编码OOP in ANSI C...
【讨论】:
virtual (function table) 和(virtual function) table 看起来是一样的,嗯?