在下面的示例中,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)
但是,
Type::Bar()不是virtual。调用时Bar(),该调用是否还会通过vtable机制执行,或者仅适用于Foo()?
调用非virtual函数的函数在编译时确定。因此,没有充分的理由让实现选择将vtable调用分派给非virtual功能的实现。但是,该标准不禁止实现将vtable偶数用于非virtual功能。
@EJP说得更好:
该标准不需要将vtable用于虚拟功能的实现。这是一个实现细节。使用vtable的合理实现不会因为包含非虚拟函数而浪费空间