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

时间:2017-09-04 01:33:29

标签: 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?

2 个答案:

答案 0 :(得分:5)

  

但是,Type::Bar()不是virtual。致电Bar()时,通话是否也通过vtable机制,还是仅适用于Foo()

调用非virtual函数的函数在编译时决定。因此,没有充分理由选择vtable来调度非virtual函数。但是,该标准并未禁止实施使用vtable即使非virtual函数。

@EJP说得更好:

标准并不要求使用vtable来实现虚拟功能。这是一个实现细节。使用vtable没有理智的实现会通过包含非虚函数来浪费空间

答案 1 :(得分:1)

vtable 的概念是一个实现细节,在c ++标准中没有进一步提及。

但是如果在类中提供了非虚函数,那么当然不需要在那里包含它们,但是在编译时完全绑定调用