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

Dynamic binding in virtual functions C++

本文关键字:动态绑定 C++ 函数 虚拟      更新时间:2023-10-16

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

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

现在我使用创建它的对象

Base b

并呼叫

b.print();

这是动态绑定吗,因为"Base"类包含1个虚拟函数,并且创建了它的VTable。。

在创建对象的同一上下文中,编译器不需要使用虚拟调度,因为它知道确切的类型。但这与虚拟函数的数量无关(是的,只要至少有一个,编译器就会生成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)
}

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

Base有一个vtable-毕竟,在编译当前文件时,编译器不能确定项目中其他地方是否有它的派生函数。

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

启用了程序集列表的建筑肯定会显示给您。