虚拟函数C++中的动态绑定
Dynamic binding in virtual functions C++
我有一个带有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查找。
启用了程序集列表的建筑肯定会显示给您。
相关文章:
- 视觉studo 2019中的漫画和静态/动态绑定
- 如何理解此C++代码中的动态绑定?
- 移动具有动态绑定的类的分配运算符
- 试图了解动态绑定和虚拟功能
- 为什么动态绑定没有按预期运行?
- 运行时动态绑定和类继承之间的区别
- 是否可以动态绑定运算符>?
- 虚拟函数C++中的动态绑定
- 需要有关初始化期间动态绑定习惯用法的帮助
- 复制对象上的C++动态绑定
- 对象实现后动态绑定大多数不相关的对象
- 套接字动态绑定到缩小范围
- C++ @ 中的动态绑定
- vtable(动态绑定)的C++思想中的多态性
- 动态绑定的条件到底是什么
- 是否有一个模板可以生成类的静态/动态绑定版本
- C++ 静态和动态绑定行为
- 我应该怎么做才能看到静态和动态绑定的作用?[C++]
- 当基类指针指向基类对象时,编译器是否将使用动态绑定
- 对C++中的异常机制执行动态绑定规则