【问题标题】:Are virtual functions safer to use than function pointers? [closed]使用虚函数是否比函数指针更安全? [关闭]
【发布时间】:2011-12-22 16:16:30
【问题描述】:

使用虚函数是否比函数指针更安全?更安全是指开发人员不太容易出错。如果它们更安全,请说明如何。

【问题讨论】:

  • 是否必须像 C 语言那样是函数指针?或者这是关于将函数作为一等值传递的所有实例?
  • @Xavier - 为什么你认为虚拟机制对开发人员来说容易出错?
  • 给出一个您可以使用其中任何一个的场景,我们将指出优缺点,在目前的形式下,问题没有任何实际意义。投票结束。
  • 为什么你会在 C++ 中使用函数指针?你总是可以使用std::function...
  • @Kerrek:“你总是可以使用std::function”?您已经可以使用它大约五分钟了,您是否已经忘记了 C++03 曾经存在过? ;-)

标签: c++ function-pointers virtual-functions


【解决方案1】:

虚拟函数可以保护您免受一个常见错误的影响:调度机制是隐藏的,因此您无法使用不合适的对象调用虚拟函数。考虑以下代码:

struct Base {
    int (*p)( Base* );
};

struct Derived {
    Derived() { Base::p = &Derived::my_p_implementation; }
};

my_p_implementation 将依赖于使用指向 Derived 实例的指针作为其第一个参数来调用,但是通过手动调度,您有上千种方法可以将不同的 Base 指针传递给 my_p_implementation。因此,虚函数更安全,因为它们不允许这种外部调度。

【讨论】:

    【解决方案2】:

    确实,虚函数被实现为(经常)作为函数指针分组到 C++ 类的每个实例的 vtable 中(因此,对于单继承类层次结构,指向 vtable 的指针是隐藏的第一个字段每个 C++ 类)。 vtable-s 由编译器管理。

    为此使用 C++ 有一个小好处:当未定义 vtable 中的函数指针时,编译器(或链接器)会给您一个错误。如果您通过包含函数指针的类似结构在 C 中执行此操作(例如 Gtk Gobject 正在执行),您将不会获得此额外的编译时检查。此外,在极少数情况下,g++ 编译器能够对此类调用进行去虚拟化(通过将间接调用替换为直接调用)。

    但是 vtable 是由函数指针组成的。遗憾的是,在 C++ 中,没有办法拥有虚拟数据(类似于许多其他对象语言中的类变量)。

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 2013-03-17
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2012-01-27
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多