【问题标题】:virtual function == function pointer?虚函数 == 函数指针?
【发布时间】:2010-05-23 12:40:06
【问题描述】:

一组分组的函数指针 进入数据结构通常是 称为虚函数 表 (VFT)。

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

【问题讨论】:

    标签: c syntax virtual-functions


    【解决方案1】:

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

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

    【讨论】:

    • 但是你可以用函数指针的结构来模拟它们;这是使用 C 的面向对象项目中使用的非常常见的设计。
    • @Matteo:是的,我知道,您可以简单地通过让一组函数的第一个参数获取您的结构的指针来模拟 OO。我的意思是语言支持。
    • 当然;实际上,我的评论并不是对您的回答的否定,只是一个澄清。 :)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 引用的说法没有错。分组到数据结构中的一组函数指针通常称为虚函数表(在 C 中)或 vtable(如果与 C++ 对象相关联)。 vtable 是虚函数的一种实现机制,虚函数与函数指针处于不同的抽象级别,而不是处于不同的组合级别。
    • @Pete Kirkham:是的,但引用的语句不等于函数指针和虚函数。
    • 那么为什么你的答案的第一行是“陈述错误”,而不是“你对陈述的感觉不是它的意思”
    • @Pete Kirkham:我的意思是 OP 的断言。哎呀,我刚刚注意到这是多么误导。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        其实C++支持虚函数,但是C不支持VF,因为两者是完全不同的概念

        【讨论】:

          【解决方案6】:

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

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

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

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

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

          【讨论】:

            【解决方案7】:

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

            这不意味着你不能编码OOP in ANSI C...

            【讨论】:

            • 是的,它来自书中。但是virtual (function table) 和(virtual function) table 看起来是一样的,嗯?
            • 既然红(苹果盒)和(红苹果)盒一样?
            猜你喜欢
            • 2017-07-25
            • 1970-01-01
            • 1970-01-01
            • 2011-10-08
            • 2013-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-29
            相关资源
            最近更新 更多