繁体   English   中英

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

[英]Dynamic binding in virtual functions C++

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

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

现在我使用创建对象

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查找。

启用了装配体列表的构建将向您显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM