虚函数C ++中的动态绑定

时间:2012-08-03 17:48:08

标签: c++

我有一个带有1个虚函数的基类

class Base
{
public:
    virtual void print() {
        cout<<"IN BASE\n";
    }
}

现在我使用

创建它的对象
Base b

并致电

b.print();

这是动态绑定吗,因为“Base”类包含1个虚函数并且已创建其VTable ..

2 个答案:

答案 0 :(得分:4)

在创建对象的相同上下文中,编译器不需要使用虚拟分派,因为它知道确切的类型。但这与虚函数的数量无关(是的,只要存在至少一个,编译器就会生成 vtable 并在对象中存储 vptr )。

Base b;
b.print(); // can be optimized to b.Base::print(),
           // with no virtual dispatch

void f( Base& b ) {
   b.print();       // must use virtual dispatch (ignoring potential inlining)
}

答案 1 :(得分:0)

术语&#34;动态绑定&#34;通常意味着其他东西 - 允许您从外部文件(DLL或SO)调用函数的管道,就好像它们是您的可执行文件的一部分一样。

Base有一个vtable可以 - 毕竟,在编译当前文件时,编译器无法确定项目中其他地方是否有任何衍生物。

现在,调用是否遵循vtable是一个实现细节 - 它取决于编译器和设置。一方面,它应该。另一方面,如果对象是自动的,那么它的类型在编译时是已知的,并且不能是Base以外的其他类型。一个好的编译器可能会优化vtable查找。

启用装配清单的建筑将确保显示。