在下面的这个例子中,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?
答案 0 :(得分:5)
但是,
Type::Bar()
不是virtual
。致电Bar()
时,通话是否也通过vtable机制,还是仅适用于Foo()
?
调用非virtual
函数的函数在编译时决定。因此,没有充分理由选择vtable
来调度非virtual
函数。但是,该标准并未禁止实施使用vtable
即使非virtual
函数。
标准并不要求使用vtable来实现虚拟功能。这是一个实现细节。使用vtable没有理智的实现会通过包含非虚函数来浪费空间
答案 1 :(得分:1)
vtable 的概念是一个实现细节,在c ++标准中没有进一步提及。
但是如果在类中提供了非虚函数,那么当然不需要在那里包含它们,但是在编译时完全绑定调用