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

When a class has some virtual methods, do all it's methods use a vtable?

本文关键字:有方法 vtable 一个 方法 虚拟      更新时间:2023-10-16

在下面的此示例中,类型具有虚拟方法,因此具有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?

但是,Type::Bar()不是virtual。调用Bar()时,该调用还可以通过VTable机制,还是仅适用于Foo()

在编译时决定呼叫非virtual功能的功能。因此,没有充分的理由选择vtable将呼叫调用到非virtual函数。但是,该标准也不禁止实现vtable甚至用于非virtual函数。

@ejp说得更好:

该标准不需要实现用于虚拟函数。这是一个实现细节。没有使用VTABLES的理智实施会浪费空间,包括非虚拟功能

A vtable 的概念是C 标准中未进一步提及的实现细节。

但是,如果班级提供了非虚拟功能,则无需在此处包含它们,但在编译时间

完全绑定了调用