接口(仅具有纯虚函数的多态类)是否具有虚表? 由于接口本身不实现多态函数且无法直接构造,因此链接器无需放置虚表。这样是吗?我特别关注MSVC编译器。
接口(仅具有纯虚函数的多态类)是否具有虚表? 由于接口本身不实现多态函数且无法直接构造,因此链接器无需放置虚表。这样是吗?我特别关注MSVC编译器。
从纯C++的角度来看,这是一个学术性问题。虚函数不一定要用vtable来实现,如果使用了vtable,就没有通用的方法可以访问它们。
如果你特别关心MSVC编译器,你可能想要在接口中使用 __declspec(novtable)
进行修饰。
(通常情况下,一个抽象类可能需要一个vtable,例如:
struct Base {
Base();
virtual void f() {}
virtual void g() = 0;
};
void h(Base& b) {
b.f(); // Call f on a Base that is not (yet) a Derived
// vtable for Base required
}
Base::Base() {
h(*this);
}
struct Derived : Base {
void g() {}
};
int main() {
Derived d;
}
)
__declspec(novtable)
扩展,明确告诉编译器可以删除vtable。在没有这个的情况下,编译器必须自行检查vtable是否不被使用。虽然这并不特别困难,但仍然不是微不足道的。由于它在常规代码中并不能提供真正的速度优势,因此我所知道的任何编译器都没有实现这个检查。
declspec(novtable)
特性:它允许接口,特别是COM接口,省略vtable。当涉及到继承时,这具有一些有趣和重要的影响(强制单一继承,但导致最终对象只有一个表提供比其他情况下更多的多态性)。 - ssube