2016-11-15 63 views
0

虚函数时使用的虚表下面是一个例子:呼吁静态分配的对象

struct A { 
    virtual int f() const { return 1; } 
}; 

struct B : A { 
    virtual int f() const { return 2; } 
}; 

int main() { 
    B b; 
    cout << b.f() << endl; 
} 

是否有将要发生的调用f()上的B,或不实例虚拟查表?或者有可能,但编译器可以优化它吗?

+1

为了使多态性正常工作,您需要一个指向基类的指针或引用。在你的情况下,不需要虚拟表查找,编译器可以自由优化它。 –

+2

由于C++标准没有指定“虚拟表查找”,所以从您展示的C++程序的角度来看,很难回答这个问题。这可能更适合作为编译器供应商关于特定编译器的问题。 –

+3

以上都不是,因为'B :: f'是私人的。 :P – aschepler

回答

2

取决于编译器和优化选项。通常,当一个现代编译器知道对象的派生类型最多时,它将优化对对象的直接虚拟调用(间接寻址)。

+0

@KerrekSB:谢谢,我的意思是写“最衍生”。抱歉。这是一个由C + 11§1.8/ 4中的标准定义的术语。 –