纯虚拟类,只有1个派生类,仍然是vtable?

时间:2012-03-26 19:41:54

标签: c++ vtable

我的问题很简单,如果你有一个纯虚拟类(接口)但是由于当前的活动构建,只编译了一个派生类,是否还会创建一个vtable?

class Foo
{
    virtual void bar() = 0;
}
#if 1
class Foo_1 : public Foo
{
void bar() {cout<<"foo_1";}
}
#else
class Foo_2 : public Foo
{
void bar() {cout<<"foo_2";}
}
#endif

他们是(据我所知)在这种情况下不需要vtable。

那么这会得到优化还是你仍然得到vtable的开销?

THX

3 个答案:

答案 0 :(得分:1)

这是潜在的链接时优化(但显然无法在编译时进行)。

答案 1 :(得分:0)

你仍然可以获得vtable。毕竟,编译器不知道是否将在其他一些翻译单元中使用类Foo。或者也许你会将它打包成一个库,其他一些用户将从Foo派生出来;再一次,编译器不知道先验。

答案 2 :(得分:0)

你可能会得到vtable的开销,因为类总是被子类化(如果示例代码的内容在标题中):

class Foo_3 : public Foo_1 {
     void bar() { Foo_1::bar(); ... }
}

如果所有代码都在同一个翻译单元中,编译器可能能够全部解决。