当类具有某些虚拟方法时,它的所有方法都使用vtable吗?

Des*_*ess 2 c++ vtable

在下面的示例中,Type具有虚拟方法,因此具有vtable。但是,Type :: Bar()不是虚拟的。调用Bar()时,该调用是否还会通过vtable机制执行,还是仅适用于Foo()?

struct Base {
  virtual void Foo() {}
}

struct Type : Base {
  void Foo() override {}
  void Bar() {}
}

Base* b = new Type();
Type* t = static_cast<Type*>(b);
t->Bar(); // Does this use a vtable?
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 5

但是,Type::Bar()不是virtual。调用时Bar(),该调用是否还会通过vtable机制执行,或者仅适用于Foo()

调用非virtual函数的函数在编译时确定。因此,没有充分的理由让实现选择将vtable调用分派给非virtual功能的实现。但是,该标准不禁止实现将vtable偶数用于非virtual功能。

@EJP说得更好:

该标准不需要将vtable用于虚拟功能的实现。这是一个实现细节。使用vtable的合理实现不会因为包含非虚拟函数而浪费空间

  • 准确地说,该标准不需要将“ vtable”用于“虚拟”功能的实现。这是一个实现细节。使用vtables的合理实现不会因为包含非virtual函数而浪费空间。 (4认同)